Mockito void doAnswer正确使用&目的

时间:2017-10-02 13:48:23

标签: java unit-testing mockito 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();
    }
}

由于stop方法无效,我需要调用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());
}
但是,我不明白这样的测试的目的是什么。为什么我会像这样测试它,因为这永远不会失败(参数isRunning正如我所期望的那样设置)。 基本上我只需要测试某些字段的状态(例如isRunningexecutor)。但是这些字段没有公共getter或setter ..

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

1 个答案:

答案 0 :(得分:4)

如果我理解你的代码示例,看起来你正在嘲笑你要测试的对象,这是99.9%的时间。您通常只想模拟您正在测试的类的直接协作者。协作者包括诸如注入服务(或其他注入字段)之类的东西,以及您正在测试的方法的参数 - 实质上是在您调用被测试方法之前代表被测试类的初始状态的任何东西。