如何測試會拋出 Exception 的 Method

拋出 Exception 的方法

在開發的過程中,難免會遇到一些方法,不會有直接的回傳結果,也許只會在過程中會產生 Exception,正常執行以後,並不會有任何反應,這時候透過傳統的 Assert 沒有辦法測出想要測試的內容。

1
2
3
4
5
public void checkEmptyUserName(String username){
if(StringUtils.isBlank(userName)){
throws new LoginFailedException("Username is empty!");
}
}

Junit Rule

Junit Rule 從 Junit 4.7 以後開始提供,主要提供了這種非典型需求的解決辦法, Rule 主要有幾種功能:

  • 對方法的測試時間設置 Timeout
  • 測試方法是否拋出預期的異常 ExpectedException
  • 避免方法預到錯誤就停下來,可以透過 ErrorCollector 蒐集起來

需要測試 Exception 是否如預期的產生,我們當然就是透過 ExpectedException 來處理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static class verfiyExceptionTest{
@Rule
public ExpectedException thrown= ExpectedException.none();

@Test
public void throwsExceptionWithMessage() {
// 預期 LoginFailed 會產生以及對應的 Exception message
thrown.expect(LoginFailedException.class);
thrown.expectMessage(startsWith("UserName"));

// 執行測試
checkEmptyUserName(StringUtils.Empty);
}
}

透過 ExpectedException 的協助,不單可以測試出是否測出預期的 Exception 同時也可以確認 Exception message 是否如預期,在測試的粒度上,又往前了一步。