Java 如何覆盖google.Truth中测试的默认失败消息?

Java 如何覆盖google.Truth中测试的默认失败消息?,java,google-truth,Java,Google Truth,我正在编写一个测试,断言文档不包含特定字符串。当测试失败时,它会在表单中打印“实际”值 expected not to contain a match for: my_regex but was : a huge document that is unreadable 文件很长。最好不要打印它,只打印文档的名称。我尝试了assertWithMessage(),但它只添加了一条消息,而没有替换默认消息。很抱歉,我们考虑偶尔提供此功能,但没有触

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

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

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

很抱歉,我们考虑偶尔提供此功能,但没有触发

首先,它通常会使断言语句比自己编写支票更长。比较:

assertThat(doc.matches(.*the regex.*)).isTrue()

assertThat(doc).displayedAs(“doc”).containsMatch(“regex”)

(平心而论,有些情况下,自己开支票并不那么容易。)

无论如何,《真理》的大部分目标是产生信息性的失败信息。如果人们有充分的理由忽略这些信息,他们可以求助于
isTrue()
断言

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

(另外,能够始终以惯用的真理方式编写断言,而不是在需要覆盖消息时切换到非惯用方式,这是很好的。)

不过,正如上面所有的附加说明所指出的,这个特性也有它的用途。“真正”的担忧主要是:

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

这里有一个相关的特性请求,它要求Truth在一定长度后截断值。事实上,我们收到了一些反馈,抱怨我们确实截断了数据,所以我们需要在这里找到一个平衡:)但我们提供某种可配置的限制似乎是合理的,可能是基于系统属性。我邀请你参加(如果你愿意的话,我还邀请你参加“覆盖默认失败消息”的活动,即使我怀疑我们不会这么做),不过我应该警告你,未来一两个季度可能不会有太多真相的发展。

事实上,我忘了:与我在中所说的相反,实际上有一种方法可以做到这一点:扩展
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?]
  }
}
其输出类似于:

expected to contain a match for: foo
but was                        : <actual value omitted>
应包含以下内容的匹配项:foo
但是:
如果您希望能够插入特定的名称,而不是
,最简单的方法可能是使用
assertWithMessage(…).about(…).that(…)
,您可以再次将其包装在助手方法中。(如果由于某种原因,
assertWithMessage
不适合,那么至少还有一种方法我可以使用。)

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