首页 > 解决方案 > 如何覆盖 google.Truth 中测试的默认失败消息?

问题描述

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

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

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

标签: javagoogle-truth

解决方案


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

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

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

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

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

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

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

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

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

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

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


推荐阅读