以下是测试:
@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)行。我怎样才能通过测试?
答案 0 :(得分:3)
如果你在main方法中捕获了所有相关的异常,那么main方法不会抛出异常,因此你的测试总是失败(因为它期望抛出异常)。
您提到的控制台输出来自异常的catch块。如果您发现异常,它就会消失,不会传递给测试。
通常,建议使用输入和输出值构建小的,可测试的方法。通常应避免为用户测试输出(如控制台输出)。通过尽可能地将逻辑与输出分开,可以在不出现上述问题的情况下彻底测试。
答案 1 :(得分:0)
@Test(expected=IllegalStateException.class)
public void invalidPort() {
SS.main(SS_ARGS);
}
将IllegalStateException替换为您期望的实际异常实现。 (也许您应该从主方法中抛出异常,而不是仅仅将其记录到stderr?)