0

私は Google Mock を初めて使用し、このコードを試していました。このリンクも確認しました。

実際の関数呼び出し回数が EXPECT_CALL(*mock, display()) と一致しない

しかし、適切な入力を得ることができませんでした。

Base.cc

class Base
{
    int val;
    string msg;
    public:
    Base():val(0), msg("world"){}
    virtual ~Base(){}
    virtual void set(int x, string msg)
    {
            this->val = val;
            this->msg = msg;
    }
    virtual void get()
    {
            cout << "val    :" << this->val << endl;
            cout << "msg    :" << this->msg << endl;
    }
};
class MockBase : public Base
{
    public:
    MOCK_METHOD0(get, void());
    MOCK_METHOD2(set, void(int val, string msg));
};

Base_unittest.cc

int main(int argc, char * argv[])
{
    std::cout << "in main" << endl;
    ::testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();
}
TEST(Base, case1)
{
    MockBase obj;
    EXPECT_CALL(obj, get()).WillOnce(::testing::Return());
}
TEST(Base, case2)
{
    MockBase obj;
    EXPECT_CALL(obj, set(2,"hello")).WillOnce(::testing::Return());
}

エラーが発生しています:

実際の関数呼び出し回数が EXPECT_CALL(obj, get()) と一致しません...

実際の関数呼び出し回数が EXPECT_CALL(obj, set(2,"hello")) と一致しません...

初心者向けのチュートリアルがあれば参照してください。

4

1 に答える 1

5

あなたの期待は、objが破棄されたときに、その関数が一度呼び出されたことを期待していると言っています。関数が実際に呼び出されていないため、失敗しています。

TEST(Base, case1)
{
    MockBase obj;
    EXPECT_CALL(obj, get()).WillOnce(::testing::Return());
    obj.get();
}

この事件を通過させるでしょう。明らかに、これはあまり役に立ちません。通常は、モックをテスト対象のオブジェクトに挿入します。また、この場合のアクションは不要であることに注意してください。次のように動作します。

TEST(Base, case1)
{
    MockBase obj;
    EXPECT_CALL(obj, get());
    obj.get();
} 

Google には参考文献がいくつかあります。

https://github.com/google/googletest/blob/master/googlemock/docs/for_dummies.md

https://github.com/google/googletest/blob/master/googlemock/docs/cheat_sheet.md

https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md

于 2013-05-13T17:32:25.733 に答える