google mock - 我可以在同一个模拟对象上多次调用EXPECT_CALL吗?

时间:2017-05-17 20:55:17

标签: unit-testing googletest googlemock

如果我在同一个EXPECT_CALL的同一个模拟对象上调用TEST_F两次。 。 。会发生什么?

期望是附加到模拟对象还是第二次调用会消除第一次调用的效果?

我发现The After Clause似乎暗示允许多次调用同一个模拟+ EXPECT_CALL。

2 个答案:

答案 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 usageRetiresOnSaturation)创建多个期望,则可以使用多种技术。经常不需要它。

答案 1 :(得分:3)

另一种有用的技术(也在“虚拟傻瓜”指南中显示)是仅编写一个EXPECT_CALL,但是链接表示预期结果的多组动作。例如:

SomeMock mock;

EXPECT_CALL(mock, foo(4))
    .WillOnce(Return(16))
    .WillOnce(Return(42))
    .WillOnce(Throw(MyException()));

这将期望对具有相同参数的方法进行三次调用,并且将前两次返回指定的值,然后在第三次调用时引发异常。

与使用多种EXPECT_CALLRetiresOnSaturation或其他技术相比,这通常更容易理解。

您也可以将其与void方法一起使用;您只需要使用DoDefault或其他一些有趣的操作来代替Return