使这个JUnit测试通过

时间:2016-06-21 18:48:36

标签: java junit server

以下是测试:

@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)行。我怎样才能通过测试?

2 个答案:

答案 0 :(得分:3)

如果你在main方法中捕获了所有相关的异常,那么main方法不会抛出异常,因此你的测试总是失败(因为它期望抛出异常)。

您提到的控制台输出来自异常的catch块。如果您发现异常,它就会消失,不会传递给测试。

通常,建议使用输入和输出值构建小的,可测试的方法。通常应避免为用户测试输出(如控制台输出)。通过尽可能地将逻辑与输出分开,可以在不出现上述问题的情况下彻底测试。

答案 1 :(得分:0)

@Test(expected=IllegalStateException.class)
public void invalidPort() {
        SS.main(SS_ARGS);
}

将IllegalStateException替换为您期望的实际异常实现。 (也许您应该从主方法中抛出异常,而不是仅仅将其记录到stderr?)