如何使用Mockito来验证是否有一组重载方法被调用?
问题描述:
我有数倍BarService
相关重载update
方法就可以了,就像这样:如何使用Mockito来验证是否有一组重载方法被调用?
BarService#update(Bar bar);
BarService#update(Bar bar, boolean checkX);
BarService#update(Bar bar, boolean checkX, boolean checkY);
我想,以确保他们的没有被称为在一个特定的测试。目前,我这样做:
@Test
public test doFoo_shouldNotUpdateBar() {
setUpTest();
doFoo();
verify(barService, never()).update(any(Bar.class)));
verify(barService, never()).update(any(Bar.class), anyBoolean()));
verify(barService, never()).update(any(Bar.class), anyBoolean(), anyBoolean()));
...
}
我可以通过所有verify
呼叫移动到一个辅助方法来检查所有重载版本打扫一下了一下:
@Test
public test doFoo_shouldNotUpdateBar() {
setUpTest();
doFoo();
verifyBarServiceNeverUpdates(any(Bar.class));
}
但有一个如何让Mockito在这里做我想做的事?基本上,要检查重载的方法是否被调用,而不考虑其参数?
答
你绝对做不手动挂上“检验规范”是名单未使用(如此规模这里暗示)方法。当你明天添加一个新方法会发生什么?然后,你将不得不转向所有的测试,并在那里添加新的方法。那是不是一种可持续的模式!
相反:
- 验证这些调用你打算发生
- ,然后调用
verifyNoMorInteractions()
你的模拟对象上,以确保良好,没有其他的方法被称为
答
如果酒吧是一个模拟和你想绝对没有互动,你可以使用Mockito的verifyZeroInteractions方法如下;
Mockito.verifyZeroInteractions(bar);
+0
这将工作,但不幸的是,我不能指望有零交互;我只是想确保没有调用'update'方法。 – Sasgorilla
这是一个可行的选择,但不幸的是,它污染了我的测试与一堆我不想要的东西。让我们说'barService'在调用'update'之前做'X'和'Y'。现在我必须在调用'verifyNoMoreInteractions(barService)'之前明确'验证(barService).doX'和'验证(barService).doY'。但在这个测试中,我实际上并不知道或关心'doX'和'doY',所以他们只是分心。 – Sasgorilla