[英]Making this JUnit Test pass
这是测试:
@Test
public void invalidPort() {
try {
SS.main(SS_ARGS);
assertTrue(false);
} catch (Exception e) {
assertTrue(true);
}
}
这是SS中的相关代码:
public static void main(String[] args) {
try {
if (obj.start() == 0) {
...stuff
}
} catch (BindException e) {
System.out.println("Address already in use.");
} catch (IOException e) {
e.printStackTrace();
}
}
这是obj.start()的作用:
public int start() {
try {
HttpServer server = HttpServerFactory.create(serverURI);
this.server = server;
server.start();
return 0;
} catch (NullPointerException e) {
System.out.println("Error: Please specify the server URI");
return 1;
} catch (Exception e) {
System.out.println("Error: Invalid port!");
return 1;
}
}
在此测试中,我确保端口无效。 运行时,程序将打印出“错误:端口无效!”。 很好,但是测试没有通过。 它失败,因为它到达了assertTrue(false)行。 我如何才能通过此考试?
如果您在main方法中捕获了所有相关的异常,则main方法将不会引发异常,因此您的测试始终会失败(因为它期望引发异常)。
您提到的控制台输出来自异常的catch块。 如果您捕获到异常,则该异常将消失并且不会传递给测试。
通常,建议使用输入和输出值构造小的可测试方法。 通常应避免为用户测试输出(如控制台输出)。 通过将逻辑与输出尽可能地分离,可以彻底测试而不会出现上述问题。
@Test(expected=IllegalStateException.class)
public void invalidPort() {
SS.main(SS_ARGS);
}
将IllegalStateException替换为所需的实际异常实现。 (也许您应该从主方法中抛出异常,而不是仅将其记录到stderr?)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.