Mockito:InOrder.verify 不禁止对模拟进行中间调用



我想测试一下,模拟方法是否以正确的顺序调用,具有正确的参数以及有关相应参数的正确方法调用数量。

假设我想测试一下,List.add被称为这样:

List<String> listMock = Mockito.mock(List.class);
listMock.add("A");
listMock.add("C");
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();

这个测试工作正常,但对于我的意图来说还不够严格。问题是,如果实际调用发生变化,测试不一定会失败。例如,如果您执行以下操作:

List<String> listMock = Mockito.mock(List.class);
listMock.add("A");
listMock.add("B");
listMock.add("C");
// this won't fail
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();

我确实想验证add首先用"A"调用,然后用"C"调用add。与此同时,add根本不应该被任何东西召唤。

我想出的唯一解决方案是Mockito.verify和InOrder.verify的组合:

// this works but doesn't seem very elegant
Mockito.verify(listMock, times(2)).add(Mockito.anyString());
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();

现在我的测试逻辑分布在Mockito.verify和InOrder.verify上。

有没有更优雅的解决方案来禁止中间调用add

您应该在模拟对象上调用 verifyNoMoreInteractions() 方法以确保不再调用:

InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
Mockito.verifyNoMoreInteractions(listMock);

这样,如果中间发生另一个调用,验证将失败,因为它需要 2 次调用,而您的示例调用它 3 次。它还确保以完全所需的顺序精确地使用给定的参数进行调用。

相关内容

  • 没有找到相关文章

最新更新