Java Mockito:ToomanyActualin职业

Java Mockito:ToomanyActualin职业,java,mockito,Java,Mockito,我有一个类,其中有一个方法(executeLocal)要测试: public class SDExecuter { ... public boolean executeLocal() { steps++; resetDisturbance(); for (;;) { try { Ev

我有一个类,其中有一个方法(executeLocal)要测试:

    public class SDExecuter {
    ...    
    public boolean executeLocal() {
                steps++;
                resetDisturbance();
                for (;;) {
                    try {
                        Event event = initialEventSequence.getFirst();
                        if (event.getActualEventTime() < timeManager.roundLocaTime(steps
                                * timeManager.getTps())) {
                            initialEventSequence.remove(event);
                            calculateIntervalBetweenEvents(event);
                            actualizedEventSequence.add(event);
                            continue;
                        }
                        informWithDisturbanceTorque();
                        break;
                    } catch (NoSuchElementException nsee) {
                        informWithDisturbanceTorque();
                        return true;
                    }
                }
                return false;
            }
    ...
    public void informWithDisturbanceTorque() {
            if (hasDisturbed) {
                disturbanceControl.setDistrubanceTorque(disturbanceTorqueVector);
            }
        }
...
    }
调用该方法时,此方法将带有接收参数的消息打印到控制台

我为类的一个对象制作了一个mockito间谍:

spyDisturbanceControl = spy(new DisturbanceControl(null));
并对控制台反映的方法进行一些调用:

have a call with argument: {{-1.0}, {0.0}, {-1.0}}
have a call with argument: {{0.0}, {-1.0}, {0.0}}
问题是:当我在以下人员的帮助下验证呼叫数时:

 @Test
public void executeLocalTest() {
    for (int i = 0; i < 20; i++) {
        sdExecuter.executeLocal();
        if (timeManager.getStepNumber() == eventTact[2]) {
            verify(spyDisturbanceControl, times(1)).setDistrubanceTorque(
                    new VectorColumn3d(-1.0d, 0.0d, -1.0d));
        }
        if (timeManager.getStepNumber() == eventTact[3]) {
            verify(spyDisturbanceControl, times(1)).setDistrubanceTorque(
                    new VectorColumn3d(0.0d, -1.0d, 0.0d));
        }
        timeManager.makeTimeStep();
    }
}
@测试
public void executeLocalTest(){
对于(int i=0;i<20;i++){
sdExecuter.executeLocal();
if(timeManager.getStepNumber()==eventTact[2]){
验证(SpydDistrunceControl,乘以(1))。设置DistrunceTorque(
新的向量柱3D(-1.0d,0.0d,-1.0d));
}
if(timeManager.getStepNumber()==eventTact[3]){
验证(SpydDistrunceControl,乘以(1))。设置DistrunceTorque(
新矢量柱3d(0.0d,-1.0d,0.0d);
}
timeManager.makeTimeStep();
}
}
测试以错误结束:

    Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.579 sec <<< FAILURE!
executeLocalTest(test.SDExecuterTest)  Time elapsed: 0.5 sec  <<< FAILURE!
org.mockito.exceptions.verification.TooManyActualInvocations: 
disturbanceControl.setDistrubanceTorque(
    {{0.0}, {-1.0}, {0.0}}
);
Wanted 1 time:
-> at test.SDExecuterTest.executeLocalTest(SDExecuterTest.java:92)
But was 2 times. Undesired invocation:
-> at test.SDExecuter.informWithDisturbanceTorque(SDExecuter.java:197)

    at test.SDExecuterTest.executeLocalTest(SDExecuterTest.java:92)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)

测试运行:1,失败:1,错误:0,跳过:0,经过的时间:0.579秒,但您调用了两次。您可能应该使用
次(2)
,因为您调用了两次…但参数不同。。有两种不同的调用。不是吗?嗯,我没看到。。。你能粘贴Mockito错误消息的其余部分吗?只有一个问题:你是否对一个实例使用该方法,但对另一个实例进行检查?显示更多代码。。。
    Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.579 sec <<< FAILURE!
executeLocalTest(test.SDExecuterTest)  Time elapsed: 0.5 sec  <<< FAILURE!
org.mockito.exceptions.verification.TooManyActualInvocations: 
disturbanceControl.setDistrubanceTorque(
    {{0.0}, {-1.0}, {0.0}}
);
Wanted 1 time:
-> at test.SDExecuterTest.executeLocalTest(SDExecuterTest.java:92)
But was 2 times. Undesired invocation:
-> at test.SDExecuter.informWithDisturbanceTorque(SDExecuter.java:197)

    at test.SDExecuterTest.executeLocalTest(SDExecuterTest.java:92)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)