google mock expect_call 退出另一个期望

google mock expect_call to retire another expectation

我有两个模拟。对于一个 运行 应该只调用其中一个,我想在不知道给定先决条件的情况下使用期望来确定 execute() 函数是否成功。
如何实现?

Mock1 successMock;
Mock2 failMock;

EXPECT_CALL(successMock, performOnSuccess()).Times(1);
EXPECT_CALL(failMock, performOnFail()).Times(0);
execute(successMock, failMock);

以上应该有效或低于预期,但只有一个。

EXPECT_CALL(successMock, performOnSuccess()).Times(0);
EXPECT_CALL(failMock, performOnFail()).Times(1);

期望的是一个(并且只有一个)协作者被调用。

一个可行的解决方案(如 other languages 中所述)是使这些模拟在测试范围内增加一个共享计数器

您可以通过 defining actions 使用 GoogleMock 实现此目的。应该是这样的:

SuccessMock successMock;
FailMock failMock;

int callCounter = 0;


ON_CALL(successMock, performOnSuccess())
  .WillByDefault(InvokeWithoutArgs([&]()
                 {
                     callCounter++;
                 });

ON_CALL(failMock, performOnFailure())
  .WillByDefault(InvokeWithoutArgs([&]()
                 {
                     callsCounter++;
                 });


execute(successMock, failMock);

ASSERT_THAT(callsCounter, Eq(1));

话虽如此,这个测试有一些我不太喜欢的随机性。您应该最终得到一个预期失败的测试和另一个预期成功的测试。

我为此写了一个简化的gist