我可以使用 google mocks 来检查方法参数而不提前设置期望吗?

nap*_*con 3 c++ unit-testing googletest googlemock

我有一种情况,我想检查是否使用参数 X 调用了模拟对象方法,但测试仅调用模拟才能访问 X ,因此我无法事先设置 EXPECT_CALL。

例如

// The class I'm testing.
class Maker
{
    void register(Listener& lis);
    Obj& make()
    {
        // make new Obj o
        // call created(o) on registered Listener  
        // return o
    }
}

class Listener
{
    virtual void created(Obj& o) = 0;
}

// The test
Listener lis;
Maker maker;
maker.register(lis);

Obj& o = maker.make();

// Check that lis was invoked using param o...how?
Run Code Online (Sandbox Code Playgroud)

我可以用谷歌模拟来做到这一点吗?使用谷歌模拟执行此操作的最优雅/可读的方式是什么?

显然我可以制作自己的 MockListener 来记录调用参数,而不是使用谷歌模拟。但我希望 google mocks 能够提供一种更易读的机制,类似于 EXPECT_CALL。

Ant*_*rez 6

您可以使用SaveArg<N>操作来保存Listener::created(Obj&)被调用参数的值,以便您可以将其值与maker.make()之后返回的值进行比较。

这将要求您为类提供相等运算符Obj,即bool operator==(const Obj&, const Obj&)

您的测试可能如下所示:

class ListenerMock : public Listener
{
public:
    MOCK_METHOD1(created, void(Obj&));
};

TEST(MakerTest, make_registersObject)
{
    ListenerMock lis;
    Maker maker;
    maker.register(lis);

    Obj createdArg;
    EXPECT_CALL(lis, created(_))
        .Times(1)
        .WillOnce(SaveArg<0>(&createdArg));

    Obj& o = maker.make();

    ASSERT_EQ(createdArg, o);
}
Run Code Online (Sandbox Code Playgroud)