2012-01-19 97 views
2

同じクラスの他のメソッド呼び出し内からメソッド呼び出しをモックすることはできますか?私はC++(主にCの開発者)に慣れ親しんでおり、googlemockとGoogle Testにはとても新しいので、これが他の場所で回答されても答えが分からない場合は私を許してください!以下は私がしたいことを説明する簡単な例です。以下の例を使用して、を模倣し、ReturnInputPlus1をテストしたいと思います。同じクラスの他のメソッド呼び出し内からgooglemock mockメソッド呼び出しを行うことはできますか?

using ::testing::Invoke; 
using ::testing::_; 
using ::testing::Return; 

class MyClass 
{ 
public: 
    MyClass() : x(1) {} 
    virtual ~MyClass() {} 

    int ReturnInput(int x) { return x; } 
    int ReturnInputPlus1(int x) { return ReturnInput(x) + 1; } 
}; 

class MockMyClass : public MyClass 
{ 
public: 
    MockMyClass() 
    { 
     ON_CALL(*this, ReturnInput(_)).WillByDefault(Invoke(&real, &MyClass::ReturnInput)); 
     ON_CALL(*this, ReturnInputPlus1(_)).WillByDefault(Invoke(&real, &MyClass::ReturnInputPlus1)); 
    } 
    virtual ~MockMyClass() {} 

    MOCK_METHOD1(ReturnInput, int(int y)); 
    MOCK_METHOD1(ReturnInputPlus1, int(int)); 

private: 
    MyClass real; 
}; 

TEST(MyClassTest, mockUseClassMethod) 
{ 
    MockMyClass mock; 

    EXPECT_CALL(mock, ReturnInput(_)) 
     .WillOnce(Return(2)); 
    EXPECT_CALL(mock, ReturnInputPlus1(_)) 
     .Times(1); 

    EXPECT_EQ(3, mock.ReturnInputPlus1(1)); 
} 

上記のテストを実行すると、すべてのテストが成功すると思います。

1>[ RUN  ] MyClassTest.mockUseClassMethod 
1>.\MyClassTest.cpp(15): error: Value of: mock.ReturnInputPlus1(1) 
1> Actual: 2 
1>Expected: 3 
1>.\DllInfoTest.cpp(10): error: Actual function call count doesn't match EXPECT_CALL(mock, ReturnInput(_))... 
1>   Expected: to be called once 
1>   Actual: never called - unsatisfied and active 

答えて

3

あなたの呼び出しをrealMyClass::ReturnInputPlus1(1)呼び出しMockMyClass::ReturnInputPlus1(1)にデフォルトでは、MyClass::ReturnInput(2)を呼び出します。その代わり、私は次の出力を取得します。 ReturnInputPlus1()が実行されているオブジェクトはmockではなく、mock.realです。ReturnInput()を呼び出すと、関数の元のバージョンが呼び出されます。あなたがしたいのは、ReturnInput()のモックオーバーライドを持つMockMyClassを作成することですが、ReturnInputPlus1()をモックアウトしません。あなたのクラスのモックバージョンとそれが時に委譲する実際のバージョンの両方を持つことは望ましくありません。

関連する問題