我们有一个测试套件,主要使用JUnitAssert和Hamcrest匹配器。我们的一个团队开始试验AssertJ,它的语法、灵活性和声明性给人们留下了深刻的印象。JUnit提供的一个特性,我在AssertJ中找不到它的等价物:添加自定义Assert失败消息。
我们经常比较的对象不是为了人类的可读性而设计的,它们的ID或UUID看起来随机,而且不可能通过它们所包含的数据来判断它们应该是什么。这对我们的代码库来说是不可避免的情况,遗憾的是,它所实现的部分目的是在其他服务之间Map数据,而不必理解它是什么。
在JUnit中,assertThat
方法提供了一个在Matcher<T>
参数之前有一个String reason
参数的版本,这使得添加一个简短的调试字符串来阐明问题变得很容易,比如比较对人类意味着什么。
另一方面,AssertJ提供了无数不同的泛型化static assertThat
方法,这些方法返回某种形式的interface Assert或它的许多实现类中的一个。
有没有办法从AssertJ API或它的扩展之一获得此功能,而不必向create a custom assert class for every assert type添加消息?
4条答案
按热度按时间piztneat1#
按照传统的方式,我在发布问题后很快就找到了我想要的东西。希望这能让下一个人更容易找到它,而不必先知道它的名字。神奇的方法是一个看起来很短的名称
as
,它是AbstractAssert
实现的另一个接口的一部分:Descriptable,而不是基本Assert接口。public S as(String description, Object... args)
设置支持
String.format(String, Object...)
语法的此对象的说明。示例:
其中catch区块
hasMessage
中的引号字串,是判断提示失败时,出现在公寓测试输出记录档中的字串。我注意到问题中链接的custom assert page中的
failWithMessage
帮助器,发现了这一点。该方法的JavaDoc指出它是受保护的,因此调用者不能使用它来设置自定义消息。但它确实提到了as
帮助器:此外,这个方法会遵循使用
as(String, Object...)
设定的任何描述,或使用overridingErrorMessage(String, Object...)
覆写使用者定义的错误消息。...以及overridingErrorMessage帮助器,它使用提供的新字符串完全替换标准AssertJ
expected: ... but was:...
消息。AssertJ主页直到特性突出显示页面才提到这两个helper,该页面在软Assert部分显示了
as
helper的示例,但没有直接描述它的功能。djp7away2#
除了使用
Descriptable.as
,您也可以使用AbstractAssert.withFailMessage()
:与使用
Descriptable.as
的不同之处在于,它使您能够完全控制自定义消息-没有“预期”和“但曾经”。这在测试的实际值对显示没有用的情况下很有用-此方法允许您显示其他可能计算的值,或者根本不显示。
重要注意事项,就像
Descriptable.as
一样,您必须在任何实际Assert * 之前 * 调用withFailMessage()
-否则它将不起作用,因为Assert将首先触发。这在Javadoc中有说明。cotxawn73#
在AssertJ中使用内置的
as()
方法。例如:4uqofj5v4#
到目前为止提到的两个选项是
as
和withFailMessage
,所以我不再讨论语法或用法。要了解它们之间的区别,以及每个选项的用处,请考虑我们测试导出的指标的用例:我已经使用Java11语法来减少一些样板文件。
如果没有
withFailMessage
,如果map中不存在计量器,默认输出包含map中所有条目的转储,这会使测试日志变得混乱。我们不关心其他计量器是否存在,只关心我们想要的计量器是否存在。使用
withFailMessage
,输出变为:对于
as
,它只将给定的消息附加到输出中,但保留失败的比较,这非常有用。