gpt4 book ai didi

java - 验证模拟调用的顺序

转载 作者:行者123 更新时间:2023-11-29 04:32:10 26 4
gpt4 key购买 nike

我需要测试一个对象是否以正确的顺序调用其他对象的方法。不幸的是,Mockito 似乎对具有相同参数的调用使用了某种分组。我准备了说明此行为的示例。

public class TestInOrder {

@Test
public void test() {
Foo foo = new Foo();
Bar mockBar = mock(Bar.class);
foo.run(mockBar);

InOrder order = Mockito.inOrder(mockBar);
order.verify(mockBar).A();
order.verify(mockBar).B();
order.verify(mockBar).B();
order.verify(mockBar).A();
order.verify(mockBar).B();
}
}

class Foo {

void run(Bar mockBar) {
mockBar.A();
mockBar.B();
mockBar.B();
mockBar.A();
mockBar.B();
}

}

class Bar {
public void A() {
}

public void B() {
}
}

结果是:

    org.mockito.exceptions.verification.VerificationInOrderFailure: 
Verification in order failure:
bar.B();
Wanted 1 time:
-> at com.goeuro.pi.provider.busfor.TestInOrder.test(TestInOrder.java:19)
But was 3 times. Undesired invocation:
-> at com.goeuro.pi.provider.busfor.Foo.run(TestInOrder.java:32)

我不明白为什么会出现此错误。测试中的调用顺序与方法中的调用顺序相同。

最佳答案

问题是您希望对每个模拟进行一次调用。相反,Mockito 将对特定模拟的所有调用进行计数,并在连续 2 次发生时失败。这是 InOrderImpl 类中验证方法的实现。

public <T> T verify(T mock) {
return this.verify(mock, VerificationModeFactory.times(1));
}

如您所见,它告诉 mockito 期望对方法进行精确的一次调用。来自 JavaDoc:

Allows verifying exact number of invocations.

使用VerificationMode告诉 Mockito 如何验证你的模拟。这应该有所帮助:

InOrder order = Mockito.inOrder(mockBar);
order.verify(mockBar).A();
order.verify(mockBar, times(2)).B();
order.verify(mockBar).A();
order.verify(mockBar).B();

关于java - 验证模拟调用的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43393894/

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