JUnit测试一个静态void方法

时间:2013-12-17 15:26:22

标签: java string logging junit void

所以我创建了一个日志功能,这样我就可以看到每个动作的日期。我现在想对它们进行单元测试。因为函数使用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

3 个答案:

答案 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!"));