我应该如何处理自定义Hamcrest匹配器中的异常?

时间:2016-09-16 13:08:56

标签: java junit hamcrest

我正在使用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声明一个已检查的异常,我需要以某种方式处理它。我看到两种可能的处理方式,但也许我忽视了一些事情:

  1. 捕获已检查的异常并将其包装在运行时异常中,然后抛出该异常。
  2. 捕获已检查的异常并返回false。实际上我使用的是TypeSafeDiagnosingMatcher,所以这里需要关注的是,不匹配描述应该(可能是?)对于两种可能的场景是不同的:空列表或抛出的异常。
  3. 在任何情况下哪种情况都是处理异常的最佳做法?

1 个答案:

答案 0 :(得分:1)

您希望能够尽快调试失败的测试。因此:您应该更喜欢选项1.

因为在这种情况下,您的“封闭”测试将在该运行时异常上失败;它会打印异常内容给你。所以你知道测试失败的地点和原因。

将其与:静默地将异常转换为“假”;最后用 assertThat 告诉你你的比赛失败了。也许你可以设法最终给出一个有意义的信息;但仍然:你必须投入一些“能量”才能到达那里。选项1免费提供 - 尝试/捕获重新抛出。

所以,我建议:选择选项1 - 看看它是如何运作的。如果由于某种原因这不够“好”;然后投入更多时间,看看选项2是否会以某种方式改善。