[英]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.