如果我在同一个EXPECT_CALL
的同一个模拟对象上调用TEST_F
两次。 。 。会发生什么?
期望是附加到模拟对象还是第二次调用会消除第一次调用的效果?
我发现The After Clause似乎暗示允许多次调用同一个模拟+ EXPECT_CALL。
答案 0 :(得分:5)
来自ForDummies:
默认情况下,当调用mock方法时,Google Mock会搜索 期望按照相反的顺序定义,并停止时 找到与参数匹配的主动期望(你可以想到 它作为“较新的规则覆盖旧的规则。”。)。
在以下文件中,测试TheSameArgumentsGoingToFail
将失败,因为第二个期望将匹配两次,而第一个期望将完全不匹配。请注意,测试'DifferentArgumentsGoingToBeOk`将通过。
#include <gmock/gmock.h>
using namespace ::testing;
struct SomeMock
{
MOCK_CONST_METHOD1(foo, void(int));
};
TEST(Examples, TheSameArgumentsGoingToFail)
{
SomeMock mock;
EXPECT_CALL(mock, foo(4));
EXPECT_CALL(mock, foo(4));
mock.foo(4);
mock.foo(4);
}
TEST(Examples, DifferentArgumentsGoingToBeOk)
{
SomeMock mock;
EXPECT_CALL(mock, foo(4));
EXPECT_CALL(mock, foo(5));
mock.foo(4);
mock.foo(5);
}
如果您想使用相同的参数(InSequence usage,RetiresOnSaturation)创建多个期望,则可以使用多种技术。经常不需要它。
答案 1 :(得分:3)
另一种有用的技术(也在“虚拟傻瓜”指南中显示)是仅编写一个EXPECT_CALL
,但是链接表示预期结果的多组动作。例如:
SomeMock mock;
EXPECT_CALL(mock, foo(4))
.WillOnce(Return(16))
.WillOnce(Return(42))
.WillOnce(Throw(MyException()));
这将期望对具有相同参数的方法进行三次调用,并且将前两次返回指定的值,然后在第三次调用时引发异常。
与使用多种EXPECT_CALL
和RetiresOnSaturation
或其他技术相比,这通常更容易理解。
您也可以将其与void方法一起使用;您只需要使用DoDefault
或其他一些有趣的操作来代替Return
。