如何使用 Mockito 来验证一组重载方法是否被调用?

Sas*_*lla 6 java mockito

我有BarService多个相关的重载update方法,如下所示:

BarService#update(Bar bar);
BarService#update(Bar bar, boolean checkX);
BarService#update(Bar bar, boolean checkX, boolean checkY);
Run Code Online (Sandbox Code Playgroud)

我想确保在特定测试中没有调用它们。目前,我正在这样做:

@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()));
    ...
}
Run Code Online (Sandbox Code Playgroud)

verify我可以通过将所有调用移至辅助方法来检查所有重载版本来清理此问题:

@Test
public test doFoo_shouldNotUpdateBar() {
    setUpTest();
    doFoo();
    verifyBarServiceNeverUpdates(any(Bar.class));
}
Run Code Online (Sandbox Code Playgroud)

但是有没有办法让 Mockito 做我想做的事情呢?基本上,检查重载方法是否被调用而不考虑其参数?

Gho*_*ica 3

您绝对不要手动放置列出未使用的方法的“验证规范”(按此处暗示的规模)。明天添加新方法时会发生什么?然后你必须转向所有测试并在那里添加新方法。这不是一个可持续的模式!

反而:

  • 验证您打算进行的这些通话
  • 然后调用verifyNoMorInteractions()您的模拟对象以确保没有调用其他方法

  • 这是一个可行的选择,但不幸的是它用一堆我不想要的东西污染了我的测试。假设“barService”在调用“update”之前执行了“X”和“Y”。现在,在调用“verifyNoMoreInteractions(barService)”之前,我必须明确“verify(barService).doX”和“verify(barService).doY”。但在这个测试中我实际上并不知道或关心“doX”和“doY”,所以它们只是分散注意力。 (2认同)