2016-09-16 83 views
1

我正在使用JUnit和Hamcrest進行一些自動化測試。爲了使我的測試更具可讀性,我想創建一個自定義匹配器,但是我在matchesSafely方法中調用的代碼可能會引發異常。我不確定如何處理這些異常,因爲matchesSafely的方法簽名不允許拋出異常。我應該如何處理自定義Hamcrest匹配器中的異常?

一個例子來加以說明:

public static Matcher<Session> hasObjectOfType(final Class<?> cls) { 
    return new TypeSafeMatcher<Session>() { 
     /* describeTo method skipped for brevity */ 
     protected boolean matchesSafely(Session session) { 
      return session.provideList(cls.getName()).iterator().hasNext(); 
     } 
    } 
} 

因此,這裏發生的事情是session.provideList聲明checked異常,我需要處理,不知怎的。我看到了兩種可能的方式來處理這個問題,但也許我忽略了一些東西:

  1. 捕獲檢查的異常並將其包裝在一個運行時異常中,然後拋出。
  2. 捕獲檢查的異常並返回false。實際上,我使用的是TypeSafeDiagnosingMatcher,因此這裏所關心的是對於兩種可能的情況,不匹配的描述應該不同(可能是?):空列表或拋出的異常。

在任何情況下,這將是處理異常的最佳實踐方式?

回答

1

您希望能夠儘快調試失敗的測試。因此:您應該更喜歡選項1.

因爲在這種情況下,您的「封閉」測試將在該運行時異常上失敗;它會將例外內容打印給您。所以你知道你的測試失敗的地方和原因。

比較:靜靜地把異常變成「假」;並以斷言告訴你你的比賽失敗。也許你可以設法給出一個有意義的消息,但仍然:你將不得不放入一些「能量」去那裏。選項1是免費的 - 嘗試/捕捉重新拋出。

所以,我的建議:去選擇1 - 看看它是如何工作的。如果由於某種原因,這不夠「好」;然後投入更多時間,看看選項2是否會改善事情。