如何在 EXPECT_CALL 中使用 testing::_,排除 2 个值?

How to use testing::_ in an EXPECT_CALL, excluding 2 values?

我有一个方法,它在内部调用一个 returns 布尔值的方法 - 在这个问题中,让我们命名该方法:

bool IsFilled(int value)

现在我正在测试的另一种方法被多次调用:

if (IsFilled(0)) 
{
   if (IsFilled(1)){
      ...
   } else {
      ...
   }
}

for (int i = 1; i < range; i++)
{
   if (IsFilled(i)) {
       ...
       if (IsFilled(0)) {
       
       }
   }
}

现在如何使用 gtest 正确测试它?我主要是为了覆盖和测试分支而不是价值。因此,我期待做这样的事情:

EXPECT_CALL(adapter, IsFilled(0)).Times(zeroCalls).WillOnce(IndexZeroResults);
EXPECT_CALL(adapter, IsFilled(1)).Times(oneCalls).WillOnce(IndexOneResults);
EXPECT_CALL(adapter, IsFilled(_)).Times(otherCalls).WillOnce(IndexOtherResults);

我需要将 0/1 调用分开,这样我才能测试所有分支,但是,“_”会复制 0/1 调用,因为它使用随机值进行测试。是否可以排除?

TL;DR - 交换 EXPECT_CALLs:

的顺序
EXPECT_CALL(adapter, IsFilled(_)).Times(otherCalls).WillOnce(IndexOtherResults);
EXPECT_CALL(adapter, IsFilled(1)).Times(oneCalls).WillOnce(IndexOneResults);
EXPECT_CALL(adapter, IsFilled(0)).Times(zeroCalls).WillOnce(IndexZeroResults);

这是因为 GoogleMock rules for ordering EXCEPT_CALLs。期望总是以与声明相反的顺序被考虑(所以最后声明的期望首先被验证)。就像这样,您可以在测试夹具中创建一般期望,在测试主体中创建特定期望。