1

私は長い間取締役会に潜んでいましたが、言うまでもなく、皆さんは最高であり、私の仕事を救ってくれたことに感謝しています。ここに投稿するのは初めてです。台無しにしないことを願っています。

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);

}
4

2 に答える 2

0

個別の EXPECT ステートメントを 1 つの完全な EXPECT ステートメントに結合すると、この問題は解決されます。

MOCK_EXPECT(objMockAClass.getTest).at_least(1).returns(1);- これにより、例が計画どおりに機能します。

よろしく、

于 2016-10-06T10:04:37.927 に答える