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>