Mockito void doAnswer 正确的用法和目的



今天,我学会了莫科托(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)。基本上,我只需要测试某些字段的状态(例如isRunningexecutor)。但是,这些字段没有公共getters或设定器。

因此,我认为我误解了deAnswer的用法。有人可以帮我吗?

如果我理解您的代码示例,看来您是在嘲笑要测试的对象,这是没有99.9%的时间。通常,您只想模拟您正在测试的课程的直接合作者。合作者由注射服务(或其他注入的字段)等内容组成,以及您正在测试的方法的参数 - 本质上是任何代表您在调用被测试的方法之前测试的类的初始状态。

相关内容

  • 没有找到相关文章

最新更新