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。
您可以使用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)
| 归档时间: |
|
| 查看次数: |
4770 次 |
| 最近记录: |