无法为我的void方法编写Mockito测试用例

时间:2018-05-31 10:42:09

标签: java testing mockito

我需要使用Mockito(JUnit)测试此代码:

public class Calculation {

    public void logTimeTaken(String label, long estimatedTime, int size, boolean isDebug) {
       String out = label + " took " + TimeUnit.MILLISECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS) + " milliseconds for " + size + " events!";
        if (isDebug) {
            System.out.println(out);
        } else {
            System.out.println(out);
        }
    }
}

我搜索了很多谷歌的例子,但仍然没有任何想法。

1 个答案:

答案 0 :(得分:1)

您可以使用System实例配置PrintStream,然后在调用Calculation.logTimeTaken后可以断言。

以下是一个例子:

@Test
public void canLogTimeTaken() {
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    PrintStream out = new PrintStream(bout);
    System.setOut(out);

    Calculation sut = new Calculation();
    sut.logTimeTaken("label", 20 , 2, false);
    assertEquals("if isDebug is false label took 0 milliseconds for 2 events!\n", bout.toString());
}

注意:这里没有Mockito,这只是vanilla JUnit,没有嘲弄。

但是,将logTimeTaken重构为两个截然不同的方面可能是更好的设计:

  • 导出日志消息
  • 记录该消息

例如:

public String createTimeTakenMessage(String label, long estimatedTime, int size, boolean isDebug) {
    return label + " took " + TimeUnit.MILLISECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS) + " milliseconds for " + size + " events!";
}

public void logTimeTaken(String message) {
    System.out.println(message);
}

然后测试createTimeTakenMessage是微不足道的,你甚至可以选择不测试logTimeTaken,因为它只是调用一个System方法。或者,也许你会隐藏'日志操作'在现在使用System.out的实现的接口后面,也许稍后,使用正式日志框架(如Logback)的其他实现。