gpt4 book ai didi

java - 您可以向 AssertJ assertThat 添加自定义消息吗?

转载 作者:IT老高 更新时间:2023-10-28 13:53:09 27 4
gpt4 key购买 nike

我们有一个测试套件,主要使用带有 Hamcrest 匹配器的 JUnit 断言。我们的一个团队开始尝试 AssertJ它的语法、灵 active 和声明性给人们留下了深刻的印象。 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)。

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

Sets the description of this object supporting String.format(String, Object...) syntax.
Example :

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 block hasMessage 中的引用字符串是单元测试输出日志中显示的内容。


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

Moreover, this method honors any description set with as(String, Object...) or overridden error message defined by the user with overridingErrorMessage(String, Object...).

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

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com