当前位置: 首页 > 面试题库 >

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

刘胜泫
2023-03-14
问题内容

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

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

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

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

有什么方法可以从AssertJ API或其扩展之一中获得此功能,而不必为要向其添加消息的每个断言类型创建自定义断言类?


问题答案:

以经典的方式,发布问题后,我发现了自己想要的片刻。希望这将使下一个人更容易找到,而无需首先知道它的名字。魔术方法是具有欺骗性的简称as,它是另一个AbstractAssert实现以下功能的接口的一部分:Descriptable,而不是基本的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]>”);
}


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

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

此外,此方法支持使用设置的任何描述as(String, Object...)或用户使用定义的错误消息overridingErrorMessage(String, Object...)

......而overridingErrorMessage帮手,它完全取代了标准AssertJ
expected: ... but was:...所提供的新的字符串消息。

在功能突出显示页面之前,AssertJ主页没有提到任何一个帮助程序,该页面as在“ 软断言”部分显示了该帮助程序的示例,但没有直接描述它的作用。



 类似资料:
  • 我们经常比较那些不是为了人类可读性而制作的对象,这些对象将具有随机的ID或UUID,并且不可能根据它们包含的数据来判断它们应该是什么。对于我们的代码库来说,这是一个不可避免的情况,可悲的是,它实现的目的之一是在其他服务之间映射数据,而不需要理解它是什么。 在JUnit中,方法提供的版本在参数之前带有参数。这使得添加一个简短的调试字符串变得微不足道,从而揭示了一些问题,比如比较对人类应该意味着什么。

  • 我是springboot kafka的新手,我在这篇文章后面创建了一个例子。 https://www.codenotfound.com/spring-kafka-boot-example.html 我发现您可以将kafka元数据设置为标题,但这不符合我的目的。 我能做到这一点吗?如果可能的话,我很感激你能分享一个例子。

  • 问题内容: 有没有一种方法可以为查询对象创建自定义方法,以便您可以执行以下操作? 本质上在哪里 并能够过滤掉它吗? 问题答案: 您可以对基类进行子类化以添加自己的方法: 然后,您可以在创建会话时告诉SQLAlchemy使用此新查询类(此处的文档)。从您的代码看来,您可能正在使用Flask- SQLAlchemy,因此您可以按照以下步骤进行操作: 否则,您将参数直接传递给: 到目前为止,这个新的查询

  • 问题内容: 是否可以向HTML标记添加自定义属性,如下所示? 问题答案: 您可以修改!DOCTYPE声明(即DTD)以允许它,以便[XML]文档仍然有效: 表示它是可选属性,或者您可以使用,等等。

  • 简介 此消息 用来接收 用户自定义TOPIC消息 发送过来的事件。 消息体 ChannelMessageBean 例子 Kotlin @Subscribe(threadMode = ThreadMode.MAIN) fun onReceiveCustomMessage(customEvent: ChannelMessageBean) { // TODO } ChannelMessageB

  • 是否可以在Visual Studio代码中自定义代码折叠的工作方式? 我使用一种通用模式来定义各种不同文档类型之间的代码区域。 > 所以,对于XML,我用和包装文本部分 对于typescript/JavaScript,我使用和。 在完整的Visual Studio(不是VS代码)中,我有一个自定义扩展,它可以窥探文档类型之间的模式,并基于该模式创建折叠,从而允许我创建整洁的自定义文档大纲。我希望在