Mockito inOrder.verify()失败 - “通缉但没有被调用......在以后的互动中想要任何地方”

时间:2017-11-15 19:04:46

标签: java eclipse junit mockito

我已经接受了一系列测试来开发一款简单的游戏,而且我已经达到了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);

1 个答案:

答案 0 :(得分:1)

所以这是相关的一点:

InOrder order = inOrder(walkListener, jumpListener);
order.verify(walkListener).walkPerformed(5);
order.verify(jumpListener).jumpPerformed(2);

验证

  1. 在walkListener之后调用jumpListener(你失败的情况,因为你显然根本没有调用jumpListener),
  2. 使用参数5和调用
  3. walkListener.walkPerformed()
  4. 使用参数2
  5. 调用jumpListener.jumpPerformed()
      

    在这两个语句之间是否会有其他函数调用,例如布尔函数检查参数值区间?

    不确定

    参见示例:

    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);