【问题标题】:How should I handle exceptions in custom Hamcrest matchers?我应该如何处理自定义 Hamcrest 匹配器中的异常?
【发布时间】:2016-09-16 13:08:56
【问题描述】:

我正在使用 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,所以这里需要担心的是,对于两种可能的情况,不匹配描述应该(可能?)不同:空列表或抛出的异常。

在任何情况下,哪种方式是处理异常的最佳实践方式?

【问题讨论】:

    标签: java junit hamcrest


    【解决方案1】:

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

    因为在这种情况下,您的“封闭”测试将在该运行时异常上失败;它将向您打印异常内容。这样你就知道你的测试在哪里以及为什么失败了。

    比较一下:默默地将异常变成“假”;并以 assertThat 告终,告诉您匹配失败。也许你最终可以设法给出一个有意义的信息;但仍然:你必须投入一些“能量”才能到达那里。选项 1 免费提供 - try/catch rethrow。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      相关资源
      最近更新 更多