我正在为我的纯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;
}
}
在哪里可以与我的供应商进行另一次互动?
1条答案
按热度按时间oxf4rvwz1#
您永远不会在提供商上调用
verify
。因此,仍然存在未经验证的交互,verifyNoMoreInteractions
将跳闸。您必须验证您的提供商的 * 所有 * 交互: