我需要使用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);
}
}
}
我搜索了很多谷歌的例子,但仍然没有任何想法。
答案 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)的其他实现。