gpt4 book ai didi

java - 使用 Mockito.inOrder 验证模拟方法是否以准确的顺序被调用

转载 作者:行者123 更新时间:2023-12-01 14:28:29 25 4
gpt4 key购买 nike

我正在尝试测试是否以预期顺序调用模拟对象的方法。下面是简化的例子:

@Test
public void test() {
List<String> mockedList = Mockito.mock(List.class);

for (int i = 0; i < 5; i++) {
mockedList.add("a");
mockedList.add("b");
mockedList.add("c");
}

// I want only this to pass.
InOrder inOrder1 = Mockito.inOrder(mockedList);
inOrder1.verify(mockedList).add("a");
inOrder1.verify(mockedList).add("b");
inOrder1.verify(mockedList).add("c");

// I want this to fail.
InOrder inOrder2 = Mockito.inOrder(mockedList);
inOrder2.verify(mockedList).add("c");
inOrder2.verify(mockedList).add("b");
inOrder2.verify(mockedList).add("a");
}

虽然验证顺序(c -> b -> a)与调用顺序(a -> b -> c)不同,但这个测试通过了。这是因为 Mockito 验证方法 2 是否调用了方法 1 之后的任何地方,但不是立即调用(即,中间没有调用其他方法)。因为我多次添加元素,所以这是很有可能的。这意味着,Mockito InOrder 传递给 b -> a -> c -> a -> c -> b -> c -> b -> a ...

但我希望它失败,并确保顺序始终是 a -> b -> c -> a -> b -> c -> a -> b -> c ...

更新:正确的验证方法是验证顺序相同的迭代次数(已接受答案的摘要):

for (int i = 0; i < 5; i++) {
inOrder1.verify(mockedList).add("a");
inOrder1.verify(mockedList).add("b");
inOrder1.verify(mockedList).add("c");
}

// fail the test if we missed to verify any other invocations
inOrder1.verifyNoMoreInteractions();

最佳答案

问题是你需要添加

inOrder.verifyNoMoreInteractions();

在你的循环中,你会产生这样的调用

  • 添加(a)
  • 添加(b)
  • 添加(c)
  • 添加(a)
  • 添加(b)
  • 添加(c)

当你检查

inOrder.verify(mockedList).add("b");
inOrder.verify(mockedList).add("c");
inOrder.verify(mockedList).add("a");

它匹配调用(add(b)、add(c)、add(a))。不检查其他调用。

  • 添加(a)
  • 添加(b)
  • 添加(c)
  • 添加(a)
  • 添加(b)
  • 添加(c)

所以我认为你必须有以下选择:1)验证所有调用a,b,c,a,b,c2) 验证你的模拟没有更多的交互发生

顺便说一句,如果您将验证更改为

inOrder.verify(mockedList).add("c");
inOrder.verify(mockedList).add("b");
inOrder.verify(mockedList).add("a");

它将失败,因为它与调用不匹配:-)

关于java - 使用 Mockito.inOrder 验证模拟方法是否以准确的顺序被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51691913/

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