你可以添加一个自定义的消息AssertJ assertThat?

我们有一个testing套件,主要使用与Hamcrest匹配器的JUnit断言。 我们的一个团队开始尝试AssertJ ,并以其语法,灵活性和声明性给人印象深刻。 JUnit提供了一个function,我无法在AssertJ中find相应的function:添加自定义断言失败消息。

我们经常比较不是为了人类可读性而devise的对象,并且会有随机的Ids或UUID,而且不可能通过它们包含的数据来判断它们应该是什么。 遗憾的是,这对于我们的代码库是不可避免的,因为它实现的目标之一就是在其他服务之间映射数据,而不必理解它是什么。

在JUnit中, assertThat方法在Matcher<T>参数之前提供了一个带有String reason参数的版本。 这使得添加一个简短的debugging串来解决这个问题变得微不足道,比如说比较对于一个人来说意味着什么。

另一方面,AssertJ提供了一个不同的通用static assertThat 断言 ,这个方法返回某种forms的接口Assert或其中一个实现类。 此接口不提供设置自定义消息的标准方式,以包含故障。

有没有办法从AssertJ API或其扩展之一获得这个function,而不必为我们想要添加消息的每个断言types创build一个自定义的断言类 ?

而以经典的方式,我发现我发现这个问题后,我正在寻找什么。 希望这将使下一个人更容易find,而不必先知道它的名字。 神奇的方法是看似简短的as ,它是AbstractAssert实现的另一个接口的一部分:可描述的 ,而不是基本的Assert接口。

public S as(String description, Object... args)

设置支持String.format(String, Object...)语法的此对象的描述。
例如:

 try { // set a bad age to Mr Frodo which is really 33 years old. frodo.setAge(50); // you can specify a test description with as() method or describedAs(), it supports String format args assertThat(frodo.getAge()).as("check %s's age", frodo.getName()).isEqualTo(33); } catch (AssertionError e) { assertThat(e).hasMessage("[check Frodo's age] expected:<[33]> but was:<[50]>"); } 

如果断言失败,那么在catch块中hasMessage引号的stringhasMessage就是出现在unit testing输出日志中的string。


通过在问题中链接的自定义断言页面中注意到failWithMessage助手,我发现了这一点。 该方法的JavaDoc指出它是受保护的,因此调用者不能使用它来设置自定义消息。 但是它提到了这个帮手:

而且,这个方法使用overridingErrorMessage as(String, Object...)赋予用as(String, Object...)或用户定义的重写错误消息设置的任何描述。

…和覆盖的ErrorMessage帮助器,它完全替代了标准的AssertJ expected: ... but was:...提供了新string的消息。

AssertJ主页没有提到助手,直到function突出显示页面,该页面显示了软断言部分中的助手示例,但没有直接描述它的function。

Interesting Posts