今天,我学会了莫科托(Mockito
说我想测试以下代码:
public void stop(boolean showMessage) {
if(executor != null && !executor.isShutdown() && this.isRunning) {
if(showMessage) {
View.getSingleton().showMessageDialog(Constant.messages.getString("sessionchecker.stopmessage"));
}
executor.shutdownNow();
executor = null;
extension.getCountdownTimer().stopCountdown();
this.isRunning = false;
this.usersReady.clear();
}
}
由于停止方法是一个空隙,因此我需要调用doAnswer
(如果我理解正确)。所以我尝试了以下内容:
@Test
public void testStopIsRunningFalse() {
Mockito.when(controller.isRunning()).thenReturn(true); // Mock a running service
Mockito.doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
if(controller.isRunning()) {
// Normally would actually shut down service
Mockito.when(controller.isRunning()).thenReturn(false); // Service should stop
}
return null;
}
}).when(controller).stop(false);
controller.stop(false);
boolean expected = false;
assertEquals(expected, controller.isRunning());
}
但是, i不了解这样的测试的目的。我为什么要这样测试,因为这将永远不会失败(我希望它会设置参数isRunning
)。基本上,我只需要测试某些字段的状态(例如isRunning
和executor
)。但是,这些字段没有公共getters或设定器。
因此,我认为我误解了deAnswer
的用法。有人可以帮我吗?
如果我理解您的代码示例,看来您是在嘲笑要测试的对象,这是没有99.9%的时间。通常,您只想模拟您正在测试的课程的直接合作者。合作者由注射服务(或其他注入的字段)等内容组成,以及您正在测试的方法的参数 - 本质上是任何代表您在调用被测试的方法之前测试的类的初始状态。