私は長い間取締役会に潜んでいましたが、言うまでもなく、皆さんは最高であり、私の仕事を救ってくれたことに感謝しています。ここに投稿するのは初めてです。台無しにしないことを願っています。
Linux (Virtualized Ubuntu 16.04 amd_64) 用の C++ Boost アプリケーションを作成しており、モック フレームワークに Turtle Mock を使用し、テスト フレームワークに Boost Test を使用しています。依存性注入手法を使用するクラスをテストしようとするとき、呼び出しのシーケンスを検証できるように、テスト クラスに与える必要があるクラスをモックします。ここまでは順調ですが、ここで問題が発生します。MOCK_BASE_CLASS(MockAClass, AClass) を使用して、実際の AClass の仮想メソッドをオーバーライドし、新しい MockAClass を使用してテストを進めています。AClass に仮想メソッド int getTest(int) があり、MockAClass に MOCK_METHOD(getTest, 1, int(int)) があるとします。MockAClass オブジェクトの getTest メソッドの期待値と戻り値を設定し、メソッドを呼び出すと、期待値はほとんどの場合、MOCK_EXPECT(objMockAClass.getTest) です。at_least(1) は決して検証されません。戻り値を制御できますが、呼び出しが発生したため検証されません。これは、関数が値を返す場合にのみ発生します (たとえば、関数が void getTest(int) の場合、検証はパスします)。
システムで失敗する問題の簡単な PoC を添付します。
class AClass
{
public:
virtual int getTest(int a) {return 0}
}
MOCK_BASE_CLASS (MockAClass, AClass)
{
MOCK_METHOD(getTest, 1, int(int));
}
BOOST_AUTО_TEST_CASE(SomeClassFunctionality)
{
MockAClass objMockAClass;
MOCK_EXPECT(objMockAClass.getTest).returns(1);
MOCK_EXPECT(objMockAClass.getTest).at_least(1);
objMockAClass.getTest(1);
}