gpt4 book ai didi

java - Mockito:InOrder.verify 不禁止模拟上的中间调用

转载 作者:行者123 更新时间:2023-11-30 05:42:51 26 4
gpt4 key购买 nike

我想测试模拟上的方法是否以正确的顺序、正确的参数以及与相应参数相关的正确的方法调用数量进行调用。

假设我想测试 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();

我确实想验证是否首先使用“A”调用 add,然后使用“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 次。它还确保完全按照所需的顺序调用给定的参数。

关于java - Mockito:InOrder.verify 不禁止模拟上的中间调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55357899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com