所以我创建了一个日志功能,这样我就可以看到每个动作的日期。我现在想对它们进行单元测试。因为函数使用void,我无法测试输出。
我可能会将void更改为String,但是将其用作void将会消失!
我有什么选择?
public class Logger {
public static void log(String s) {
Date d = new Date();
SimpleDateFormat ft =
new SimpleDateFormat ("yyyy.MM.dd '-' hh:mm:ss");
System.out.println("[" + ft.format(d) + "]: " + s);
}
}
JUnit的
@Test
public void testLoggerEmptyString() {
String s = "";
log(s);
}
谢谢:D
答案 0 :(得分:5)
您需要测试方法的副作用。在这种情况下,您要观察的副作用是写入System.out
的内容。您可以使用System.setOut
安装自己的OutputStream
。从那里你可以验证是否写了一些东西。
例如:
String s = "your message";
ByteArrayOutputStream sink = new ByteArrayOutputStream();
System.setOut(new PrintStream(sink, true));
log(s);
assertThat(new String(sink.toByteArray()), containsString(s));
答案 1 :(得分:1)
您可以使用库System Rules。它会在测试后自动设置System.out
。
public void MyTest {
@Rule
public final StandardOutputStreamLog log = new StandardOutputStreamLog();
@Test
public void testLoggerEmptyString() {
log("hello world");
assertEquals("hello world", log.getLog());
}
}
答案 2 :(得分:0)
我可能会将void更改为String,但是将其用作void将会消失!
我不这么认为。如果您的方法如下所示:
public static String getLogMessage(String s) {
Date d = new Date();
SimpleDateFormat ft = new SimpleDateFormat ("yyyy.MM.dd '-' hh:mm:ss");
return String.format("[%s] %s", ft.format(d), s);
}
您可以测试输出并使用
在代码中使用它System.out.println(Whatever.getLogMessage("Foo for the world"));
甚至
System.err.println(Whatever.getLogMessage("Holy shit!"));