【问题标题】:How can I override default failure message of a test in google.Truth?如何覆盖 google.Truth 中测试的默认失败消息?
【发布时间】:2019-03-05 16:36:48
【问题描述】:

我正在编写一个断言文档不包含特定字符串的测试。当测试失败时,它会在表单中打印“实际”值

expected not to contain a match for: my_regex
but was                            : a huge document that is unreadable

文档很长。最好不要打印它而只打印文档的名称。我试过 assertWithMessage() 但它只添加一条消息,而不是替换默认消息。

【问题讨论】:

    标签: java google-truth


    【解决方案1】:

    抱歉,我们曾考虑偶尔提供此功能,但没有扣动扳机。

    对于初学者来说,它通常会使断言语句比自己编写检查更长。比较:

    assertThat(doc.matches(".*the-regex.*")).isTrue();

    assertThat(doc).displayedAs("the doc").containsMatch("the-regex");

    (公平地说,在某些情况下,自己写支票并不容易。)

    无论如何,Truth 的大部分目标是产生信息丰富的失败消息。如果人们有充分的理由忽略这些信息,他们可以退回到isTrue() 断言。

    (再次公平地说,isTrue() 失败基本上会产生 no 有用的消息,而您希望“预期不包含匹配项:my_regex。”您当然可以如您所说,将其添加回assertWithMessage,但现在您的断言语句又变长了,如果您想在消息中重复“my_regex”。)

    (另外,很高兴能够始终以惯用的 Truth 方式编写断言,而不是在您想要覆盖消息时切换到非惯用的方式。)

    不过,正如上面所有括号中所指出的,此功能将有其用途。 “真正”的担忧主要是:

    • API 大小。还要考虑到有些人想要省略消息的不同部分,因此他们可能需要不止一种方法。
    • 人们可能会错误地调用此方法,不小心将信息丢弃。

    这里有一个相关的功能请求,就是让 Truth 在一定长度后截断值。实际上,我们收到反馈抱怨我们截断的情况,所以我们需要在这里取得平衡:) 但是我们提供某种可配置的限制似乎是合理的,也许基于一个系统属性。我邀请你到file an issue(如果你愿意的话,还有一个关于“覆盖默认失败消息”的事情,即使我怀疑我们不会这样做),尽管我应该警告你下一两个季度是可能不会看到很多真相的发展。

    【讨论】:

      【解决方案2】:

      实际上,我忘记了:与我在my other answer 中所说的相反,实际上有一种方法可以做到这一点:扩展StringSubject 以覆盖字符串表示,并使用您的自定义主题:

      public static StringSubject assertThatAbbreviatedString(String actual) {
        return assertAbout(abbreviatedStrings()).that(actual);
      }
      
      public static Subject.Factory<StringSubject, String> abbreviatedStrings() {
        return AbbreviatedStringSubject::new;
      }
      
      private static final class AbbreviatedStringSubject extends StringSubject {
        AbbreviatedStringSubject(FailureMetadata metadata, String actual) {
          super(metadata, actual);
        }
      
        @Override
        protected String actualCustomStringRepresentation() {
          return "<actual value omitted>";
          // [Edit: Or maybe you can extract the title from the doc and return that?]
        }
      }
      

      这使您可以编写:

      assertThatAbbreviatedString("abcdefghijklmnopqrstuvwyz").containsMatch("foo");
      

      输出类似于:

      expected to contain a match for: foo
      but was                        : <actual value omitted>
      

      如果您希望能够插入特定名称,而不是 &lt;actual value omitted&gt;,最简单的方法可能是使用 assertWithMessage(...).about(...).that(...),您可以再次将其包装在辅助方法中。 (如果 assertWithMessage 由于某种原因不合适,我至少可以采用另一种方法。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-01
        • 2020-01-17
        • 2011-06-22
        • 2019-03-20
        • 2014-03-05
        • 2014-04-04
        • 1970-01-01
        相关资源
        最近更新 更多