Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito inoorder.verify()失败-“;需要但未调用。。。在以下互动之后,需要任何地方”;_Java_Eclipse_Junit_Mockito - Fatal编程技术网

Java Mockito inoorder.verify()失败-“;需要但未调用。。。在以下互动之后,需要任何地方”;

Java Mockito inoorder.verify()失败-“;需要但未调用。。。在以下互动之后,需要任何地方”;,java,eclipse,junit,mockito,Java,Eclipse,Junit,Mockito,我得到了一系列测试来开发一个简单的游戏,我已经到了一个地步,Mockito的inoder.verify()产生了错误 验证顺序失败。需要但未调用:jumpListener.jumpPerformed(…)位于第x行。需要以下交互之后的任意位置:walkListener.walkPerformed(…)在第y行 我得到的代码看起来与下面看到的类似,其中相关函数performWalk(int x)和performJump(int y)都包含if/else逻辑中的其他函数调用,在walkListene

我得到了一系列测试来开发一个简单的游戏,我已经到了一个地步,Mockito的
inoder.verify()
产生了错误

验证顺序失败。需要但未调用:jumpListener.jumpPerformed(…)位于第x行。需要以下交互之后的任意位置:walkListener.walkPerformed(…)在第y行

我得到的代码看起来与下面看到的类似,其中相关函数
performWalk(int x)
performJump(int y)
都包含if/else逻辑中的其他函数调用,在
walkListeners.get(0)和walkPerformed(x)之前和之后
jumpListeners.get(0)、jumpPerformed(y)。在达到这一部分之前,我从未听说过Mockito,大多数问题似乎是由测试人员提出的,而不是使用测试。所以我的问题是,
inoder.verify()
对函数调用的具体要求是什么

order.verify(walkListener).walkPerformed(5);
order.verify(jumpListener).jumpPerformed(2);
在这两个语句之间是否会发生其他函数调用,比如布尔函数检查参数值间隔

public interface WalkListener extends EventListener {
    public void walkPerformed(int x);
}

public interface JumpListener extends EventListener {
    public void jumpPerformed(int y);
}

public class Game {
    private Vector<WalkListener> walkListeners;
    private Vector<JumpListener> jumpListeners;

    public void addWalkListener(WalkListener listener) { ... }
    public void addJumpListener(JumpListener listener) { ... }

    public void performWalk(int x) {   
        ... 
        walkListeners.get(0).walkPerformed(x);
        ...
    }
    public void performJump(int y) { 
        ...      
        jumpListeners.get(0).jumpPerformed(y);
        ... 
    }

    private class Walk implements WalkListener { ... }
    private class Jump implements JumpListener { ... }
}

public class GameTest {
    @Test
    public void finalTest() {
        Game game = new Game();
        WalkListener walkListener = mock(WalkListener.class)
        JumpListener jumpListener = mock(JumpListener.class)

        game.addWalkListener(walkListener);
        game.addJumpListener(jumpListener);

        game.performWalk(5);
        game.performJump(2);

        InOrder order = inOrder(walkListener, jumpListener);
        order.verify(walkListener).walkPerformed(5);
        order.verify(jumpListener).jumpPerformed(2);
    }
}
公共接口WalkListener扩展了EventListener{
已执行的公共安全检查(int x);
}
公共接口JumpListener扩展了EventListener{
公共交通(int y);
}
公开课游戏{
专用向量监听器;
专用向量监听器;
public void addWalkListener(WalkListener侦听器){…}
public void addJumpListener(JumpListener侦听器){…}
公共空性能会话(int x){
... 
walkListeners.get(0)、walkPerformed(x);
...
}
公共无效性能泵(int y){
...      
jumpListeners.get(0)、jumpPerformed(y);
... 
}
私有类Walk实现WalkListener{…}
私有类跳转实现JumpListener{…}
}
公共类游戏测试{
@试验
公共无效最终测试(){
游戏=新游戏();
WalkListener=mock(WalkListener.class)
JumpListener JumpListener=mock(JumpListener.class)
game.addWalkListener(walkListener);
game.addJumpListener(jumpListener);
游戏。performWalk(5);
游戏。性能泵(2);
顺序=顺序(walkListener、jumpListener);
顺序。验证(walkListener)。执行walkPerformed(5);
命令。验证(jumpListener)。执行的jumpPerformed(2);
}
}

所以这是相关位:

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

  • jumpListener在walkListener之后调用(这种情况下您失败了,因为您显然根本没有调用jumpListener)
  • 调用walkListener.walkPerformed()时使用参数
    5
  • jumpListener.jumpPerformed()是用参数
    2
  • 在这两个语句之间是否会发生其他函数调用,比如布尔函数检查参数值间隔

    public interface WalkListener extends EventListener {
        public void walkPerformed(int x);
    }
    
    public interface JumpListener extends EventListener {
        public void jumpPerformed(int y);
    }
    
    public class Game {
        private Vector<WalkListener> walkListeners;
        private Vector<JumpListener> jumpListeners;
    
        public void addWalkListener(WalkListener listener) { ... }
        public void addJumpListener(JumpListener listener) { ... }
    
        public void performWalk(int x) {   
            ... 
            walkListeners.get(0).walkPerformed(x);
            ...
        }
        public void performJump(int y) { 
            ...      
            jumpListeners.get(0).jumpPerformed(y);
            ... 
        }
    
        private class Walk implements WalkListener { ... }
        private class Jump implements JumpListener { ... }
    }
    
    public class GameTest {
        @Test
        public void finalTest() {
            Game game = new Game();
            WalkListener walkListener = mock(WalkListener.class)
            JumpListener jumpListener = mock(JumpListener.class)
    
            game.addWalkListener(walkListener);
            game.addJumpListener(jumpListener);
    
            game.performWalk(5);
            game.performJump(2);
    
            InOrder order = inOrder(walkListener, jumpListener);
            order.verify(walkListener).walkPerformed(5);
            order.verify(jumpListener).jumpPerformed(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)在测试结束时。

    使用您告诉Mockito的值,验证xxPerformed是否按照您预期的顺序被调用。德国劳埃德船级社!伟大的这大大减少了故障排除的次数。我的一个参数似乎与所需状态不匹配。