とよく似ていますが、これはHow to use gmock to test that a class calls it's base class' methodsと非常に密接に関連していますが、私の例ではこれを動作させるのに苦労しています。GMock check base class関数の使用方法は
私は、派生クラスを持っているし、新しい機能は、このようなときということで、他のTDDに基づいて
...私は、基本クラスを持っているように、新しい機能をテストドライブする
class SimpleObject
{
public:
explicit SimpleObject() {}
virtual void moveX(int dX)
{
// Do important stuff like updating position, bounding box etc.
}
// ...
};
をGTESTとGMockを使用しています派生したオブジェクトに対してmoveXを呼び出すと、何か具体的なことが実行されますが、SimpleObject :: moveXでは重要なことも行う必要があります。
私はすでにSimpleObject :: moveX関数に関連するテスト駆動ユニットテストを持っていますので、派生クラスに対してそれらを繰り返す必要はありません。私が知っている限り、SimpleObject :: moveXが呼び出され、すべてがうんざりです。
とにかく、上記のリンクとTDDに基づいて、私は次のようになりました。
派生クラス:
class ComplexObject : public SimpleObject
{
public:
virtual void moveX(int dX)
{
// Do something specific
}
};
'テスト可能な' クラス:
class TestableComplexObject : public ComplexObject
{
public:
MOCK_METHOD1(moveX, void(int dX));
void doMoveX(int dX)
{
SimpleObject::moveX(dX);
}
};
テスト:私は私のテストを実行する場合
TEST_F(ATestableComplexObject, CallsBaseClassMoveXWhenMoveXIsCalled)
{
int dX(8);
TestableComplexObject obj;
EXPECT_CALL(obj, moveX(dX))
.Times(1)
.WillRepeatedly(testing::Invoke(&obj, &TestableComplexObject::doMoveX));
obj.moveX(dX);
}
その後、すべてが合格します。 ComplexObject :: moveXは何もしませんので、これは正しくありません。
また、私がdoMoveXに何を置いても(これは私が期待していたと思っていたものですが)、テストは引き続き行われます。
私は明らかにここに何か簡単なものがないので、どのようなアイデアですか?
私はdoMoveXに何を置いても、テストは合格となります。さらに、ComplexObject :: doMoveXを呼び出すと、これは確実に派生した関数を呼び出すのではなく、確実に呼び出す必要のある基底関数を呼び出すでしょうか? –
はい、最後のステートメントはタイプミスでした。私は元の投稿を編集します –