我们有一个测试套件,主要使用带有Hamcrest匹配器的JUnit断言。我们的一个团队开始尝试AssertJ,并以其语法,灵活性和声明性给人留下了深刻的印象。 JUnit提供的一项功能是我无法在AssertJ中找到与之等效的功能:添加自定义断言失败消息。

我们经常在比较不是为了人类可读性而制成的对象,这些对象将具有随机查找的Id或UUID,并且无法通过包含的数据来判断它们应该是什么。不幸的是,对于我们的代码库来说,这是不可避免的情况,因为它实现的目的之一就是在其他服务之间映射数据而不必了解它是什么。

在JUnit中, assertThat 方法在String reason参数之前提供了一个带有Matcher<T>参数的版本。这使得添加简短的调试字符串变得轻而易举,从而使人们对问题有所了解,例如,比较对人类意味着什么。

另一方面,AssertJ提供了十亿种不同的genericized static assertThat 方法,这些方法返回某种形式的interface Assert或其许多实现类之一。此接口(interface)不提供设置失败时包括的自定义消息的标准方法。

有什么方法可以从AssertJ API或其扩展之一中获得此功能,而无需向我们要向其添加消息的create a custom assert class for every assert type

最佳答案

以经典的方式,发布问题后,我发现了自己想要的片刻。希望这将使下一个人更容易找到,而无需首先知道它的名字。魔术方法是具有欺骗性的短名称 as ,它是AbstractAssert实现的另一个接口(interface)的一部分:Descriptable,而不是基本的Assert接口(interface)。



如果断言失败,则捕获在块hasMessage中的带引号的字符串将出现在单元测试输出日志中。

我通过注意到问题中链接的custom assert page中的failWithMessage帮助器发现了这一点。该方法的JavaDoc指出它是 protected ,因此调用者不能使用它来设置自定义消息。但是它确实提到了as帮助器:



...和overridingErrorMessage帮助程序,它使用提供的新字符串完全替换了标准的AssertJ expected: ... but was:...消息。

在功能突出显示页面之前,AssertJ主页没有提到任何一个助手,该页面在Soft Assertions部分中显示了as助手的示例,但没有直接描述它的作用。

关于java - 您可以向AssertJ assertThat添加自定义消息吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28994316/

10-10 13:53