我应该如何处理自定义 Hamcrest 匹配器中的异常?
How should I handle exceptions in custom Hamcrest matchers?
我正在使用 JUnit 和 Hamcrest 进行一些自动化测试。为了使我的测试更具可读性,我想制作一个自定义匹配器,但是我在 matchesSafely 方法中调用的代码可能会引发异常。我不确定如何处理此类异常,因为 matchesSafely 的方法签名不允许抛出异常。
举例说明:
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 声明了一个已检查的异常,我需要以某种方式处理它。我看到了两种可能的处理方式,但也许我忽略了一些东西:
- 捕获已检查的异常并将其包装在运行时异常中然后抛出。
- 捕获已检查的异常和return false。实际上,我使用的是 TypeSafeDiagnosingMatcher,所以这里的一个问题是,对于两种可能的情况,不匹配描述应该(可能?)不同:空列表或抛出的异常。
在任何情况下,哪种方法是处理异常的最佳实践方式?
您希望能够尽快调试失败的测试。因此:您应该更喜欢选项 1。
因为在那种情况下,您的 "enclosing" 测试将因该运行时异常而失败;它将向您打印异常内容。所以你知道你的测试失败的地方和原因。
将其与以下内容进行比较:默默地将异常转换为 "false";并以 assertThat 结束,告诉您匹配失败。也许你最终可以设法给出一个有意义的信息;但仍然:你必须投入一些 "energy" 去那里。选项 1 免费提供 - try/catch 重新抛出。
所以,我的建议是:选择选项 1 - 看看它对你有何作用。如果由于某种原因不是 "good enough";然后投入更多时间,看看选项 2 是否会有所改善。
我正在使用 JUnit 和 Hamcrest 进行一些自动化测试。为了使我的测试更具可读性,我想制作一个自定义匹配器,但是我在 matchesSafely 方法中调用的代码可能会引发异常。我不确定如何处理此类异常,因为 matchesSafely 的方法签名不允许抛出异常。
举例说明:
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 声明了一个已检查的异常,我需要以某种方式处理它。我看到了两种可能的处理方式,但也许我忽略了一些东西:
- 捕获已检查的异常并将其包装在运行时异常中然后抛出。
- 捕获已检查的异常和return false。实际上,我使用的是 TypeSafeDiagnosingMatcher,所以这里的一个问题是,对于两种可能的情况,不匹配描述应该(可能?)不同:空列表或抛出的异常。
在任何情况下,哪种方法是处理异常的最佳实践方式?
您希望能够尽快调试失败的测试。因此:您应该更喜欢选项 1。
因为在那种情况下,您的 "enclosing" 测试将因该运行时异常而失败;它将向您打印异常内容。所以你知道你的测试失败的地方和原因。
将其与以下内容进行比较:默默地将异常转换为 "false";并以 assertThat 结束,告诉您匹配失败。也许你最终可以设法给出一个有意义的信息;但仍然:你必须投入一些 "energy" 去那里。选项 1 免费提供 - try/catch 重新抛出。
所以,我的建议是:选择选项 1 - 看看它对你有何作用。如果由于某种原因不是 "good enough";然后投入更多时间,看看选项 2 是否会有所改善。