我已经接受了一系列测试来开发一款简单的游戏,而且我已经达到了Mockito的InOrder.verify()
产生错误的程度。
订单失败时进行验证。通缉但未调用:在第x行跳转Listener.jumpPerformed(...)。在以下交互之后通缉任何地方:在第y行的walkListener.walkPerformed(...)。
我得到的代码看起来类似于下面的内容,其中相关函数performWalk(int x)
和performJump(int y)
都包含if / else逻辑中的其他函数调用,walkListeners.get(0).walkPerformed(x);
之前和之后{ {1}}。在达到这个部分之前我从未听说过Mockito,大多数问题似乎都是由那些制作测试的人提出的,而不是使用它们。所以我的问题是,jumpListeners.get(0).jumpPerformed(y);
对函数调用的确切要求是什么?
inOrder.verify()
在这两个语句之间是否会有其他函数调用,例如布尔函数检查参数值区间?
order.verify(walkListener).walkPerformed(5);
order.verify(jumpListener).jumpPerformed(2);
答案 0 :(得分:1)
所以这是相关的一点:
InOrder order = inOrder(walkListener, jumpListener);
order.verify(walkListener).walkPerformed(5);
order.verify(jumpListener).jumpPerformed(2);
验证
5
和调用2
在这两个语句之间是否会有其他函数调用,例如布尔函数检查参数值区间?
不确定
参见示例:
class Foo {
public void foo() {}
public void bar() {}
public void baz() {}
}
@Test
public void testFoo() {
Foo mock = mock(Foo.class);
mock.foo(); //1st
mock.bar(); //2nd
mock.baz(); //3rd
InOrder inOrder = inOrder(mock);
inOrder.verify(mock).foo(); //1st
inOrder.verify(mock).baz(); //3rd (last method)
//passes because there are no more interactions after last method:
inOrder.verifyNoMoreInteractions();
}
测试通过,因为在baz()
调用之后没有更多的方法调用。 bar()
之间的呼叫并不重要,因为这不是验证的一部分。
两个类的情况相同:
class Foo {
public void foo() {}
public void bar() {}
}
class Bar {
public void foo() {}
}
@Test
public void testFoo() {
Foo mock = mock(Foo.class);
Bar mock2 = mock(Bar.class);
mock.foo(); //1st
mock.bar(); //2nd
mock2.foo(); //3rd
InOrder inOrder = inOrder(mock, mock2);
inOrder.verify(mock).foo(); //1st
inOrder.verify(mock2).foo(); //3rd (last method)
//passes because there are no more interactions after last method:
inOrder.verifyNoMoreInteractions();
}
测试再次通过,因为第二个方法调用不是验证的一部分。
如果您希望测试在非指定方法调用中失败,则需要在测试结束时添加例如Mockito.verifyNoMoreInteractions(mock);
。