mockito NoInteractionsWanted异常

tcomlyy6  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(77)

我正在为我的纯Java服务编写测试,稍后将迁移到Sping Boot 。这个类只是从json中读取几个场景,每次使用接口 * ScenarioScript * 执行无限循环处理每个场景:

@Override
public void execute(ScenarioHandler handler) {
    execute(handler, () -> false);
}

public void execute(ScenarioHandler handler, TerminatorListener terminator) {
    List<Scenario> scenarioList = provider.readScenarios();
    validateScenarios(scenarioList);
    listen(scenarioList, handler, terminator);
}

private void listen(List<Scenario> scenarioList, ScenarioHandler handler, TerminatorListener terminator) {
    int currentIndex = 0;
    while (!terminator.shouldTerminate()) {
        Scenario scenario = scenarioList.get(currentIndex);
        handler.onScenarioReceived(scenario);
        currentIndex = (currentIndex + 1) % scenarioList.size();
        sleep();
    }
}

在这里,我已经做了方法重载,以便能够执行测试。我得到一个org.Mockito.exception.verifications.NoInteractionWanted异常,带有以下堆栈跟踪:

No interactions wanted here:
-> at executor.service.service.ScenarioSourceListenerTest.tearDown(ScenarioSourceListenerTest.java:65)
But found this interaction on mock 'scenarioProvider':
-> at executor.service.service.impl.ScenarioSourceListenerImpl.execute(ScenarioSourceListenerImpl.java:30)
Actually, above is the only interaction with this mock.

我的测试在这里提供:

private ScenarioProvider provider;

private ScenarioHandler handler;

@BeforeEach
public void setUp() {
    provider = mock(ScenarioProvider.class);
    handler = mock(ScenarioHandler.class);
    listener = new ScenarioSourceListenerImpl(provider);
}

@Test
public void testExecute_numberOfTimes() {
    int maxIterations = 5;
    TerminatorListener terminator = new TestTerminator(maxIterations);

    given(provider.readScenarios()).willReturn(prepareScenarioList());

    listener.execute(handler, terminator);

    verify(handler, times(maxIterations)).onScenarioReceived(any(Scenario.class));
}

@AfterEach
void tearDown() {
    verifyNoMoreInteractions(provider);
    verifyNoMoreInteractions(handler);
}

private class TestTerminator implements TerminatorListener {
    private int maxIterations;
    private int currentIteration = 0;

    public TestTerminator(int maxIterations) {
        this.maxIterations = maxIterations;
    }

    @Override
    public boolean shouldTerminate() {
        currentIteration++;
        return currentIteration > maxIterations;
    }
}

在哪里可以与我的供应商进行另一次互动?

oxf4rvwz

oxf4rvwz1#

@Test
public void testExecute_numberOfTimes() {
    int maxIterations = 5;
    TerminatorListener terminator = new TestTerminator(maxIterations);

    given(provider.readScenarios()).willReturn(prepareScenarioList());

    listener.execute(handler, terminator);

    verify(handler, times(maxIterations)).onScenarioReceived(any(Scenario.class));
}

@AfterEach
void tearDown() {
    verifyNoMoreInteractions(provider);
    verifyNoMoreInteractions(handler);
}

您永远不会在提供商上调用verify。因此,仍然存在未经验证的交互,verifyNoMoreInteractions将跳闸。
您必须验证您的提供商的 * 所有 * 交互:

given(provider.readScenarios()).willReturn(prepareScenarioList());

listener.execute(handler, terminator);

verify(handler, times(maxIterations)).onScenarioReceived(any(Scenario.class));
verify(provider).readScenarios();

相关问题