mockito 变更gmock预期

r3i60tvu  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(115)

我想用GMock编写一个单元测试。但是,我主要熟悉Mockito。我想用Mockito编写的是:

Mockito.verify(mock, Mockito.never()).someFunctionCall(Matchers.<String>any());
doSomething(mock);
Mockito.verify(mock, Mockito.times(1)).someFunctionCall(Matchers.<String>any());
doSomethingElse(mock);

这对应于验证doSomething从不调用someFunctionCall,但只被doSomethingElse调用一次。
我如何用GMock完成同样的事情?

EXPECT_CALL(mock, someFunctionCall(_)).Times(0);
doSomething(mock);
EXPECT_CALL(mock, someFunctionCall(_)).Times(1);
doSomethingElse(mock);

显然不起作用,因为期望值叠加。

vxqlmq5t

vxqlmq5t1#

Mock::VerifyAndClearExpectations / Mock::VerifyAndClear可以用于这些目的。

koaltpgm

koaltpgm2#

对于类似的情况,您可能需要设置两个不同的测试。一个针对doSomething,另一个针对doSomethingElse。或者,如果第二个测试的行为依赖于第一个测试,则可以执行以下操作:

{
  MyMock mock;
  EXPECT_CALL(mock, someFunctionCall(_)).Times(0);
  doSomething(mock);
}
{
  MyMock mock;
  EXPECT_CALL(mock, someFunctionCall(_)).Times(1);
  doSomethingElse(mock);
}

Assert的验证是在对象销毁时完成的,因此将每个mock的作用域限定为它所需要的调用集将验证Assert。但实际上,我可能会尝试将两个方法的测试分开到单独的测试中。如果您有不想重复的样板设置,请将其粘贴到TEST_F派生的基类中。

相关问题