优雅断言:使用 AssertJ 实现更简洁的代码的自定义软断言
介绍
如果您不知道什么是软断言,请阅读软断言 – 为什么应该将它们用于单元和集成测试?
本文是 Assert with Grace: Custom Assertions for Cleaner Code 的延续,它向您展示了如何使用 AssertJ 创建自定义断言。在这里,您将学习如何扩展其方法以在自定义断言之上使用软断言方法。
使用 AssertJ 自定义软断言
您可以使用 AssertJ 中的 Assertions 类或自定义类进行硬断言。为了获得软断言的所有好处,我们需要:
- 实现自定义断言
- 创建自定义软断言类并从 AssertJ 扩展 AbstractSoftAssertions
自定义断言
您在 Assert with Grace: Custom Assertions for Cleaner Code 一文中了解了如何创建自定义断言。看起来像这样:
public class SimulationAssert extends AbstractAssert<SimulationAssert, Simulation> { protected SimulationAssert(Simulation actual) { super(actual, SimulationAssert.class); } public static SimulationAssert assertThat(Simulation actual) { return new SimulationAssert(actual); } public SimulationAssert hasValidInstallments() { isNotNull(); if (actual.getInstallments() < 2 || actual.getInstallments() >= 48) { failWithMessage("Installments must be must be equal or greater than 2 and equal or less than 48"); } return this; } public SimulationAssert hasValidAmount() { isNotNull(); var minimum = new BigDecimal("1.000"); var maximum = new BigDecimal("40.000"); if (actual.getAmount().compareTo(minimum) < 0 || actual.getAmount().compareTo(maximum) > 0) { failWithMessage("Amount must be equal or greater than $ 1.000 or equal or less than than $ 40.000"); } return this; } }
自定义断言的使用在测试中显示出更多的易读性,并将测试有效值的责任发送给它:
class SimulationsCustomAssertionTest { @Test void simulationErrorAssertion() { var simulation = Simulation.builder().name("John").cpf("9582728395").email("john@gmail.com") .amount(new BigDecimal("1.500")).installments(5).insurance(false).build(); SimulationAssert.assertThat(simulation).hasValidInstallments(); SimulationAssert.assertThat(simulation).hasValidAmount(); } }
有了自定义断言,是时候实现自定义软断言了。
创建自定义软断言
创建自定义软断言的过程很简单,前提是实现自定义断言。鉴于上一篇文章,我们将SimulationAssert 类作为自定义断言,并将创建SimulationSoftAssert 作为自定义软断言。步骤如下:
- 扩展 AbstractSoftAssertions 类
- 使用以下命令创建assertThat()方法:
- 该方法返回一个对象作为自定义断言类
- 断言主题的参数
- 该方法返回方法代理,其中参数是自定义断言类和断言的主题
- 使用以下命令创建assertSoftly() 方法:
- 作为自定义软断言类的 Consumer 的参数
- 使用SoftAssertionsProvider.assertSoftly()方法,参数是自定义软断言类,方法参数
步骤看起来很复杂,但实际上,你最终会得到这样的结果:
public class SimulationSoftAssert extends AbstractSoftAssertions { public SimulationAssert assertThat(Simulation actual) { return proxy(SimulationAssert.class, Simulation.class, actual); } public static void assertSoftly(Consumer<SimulationSoftAssert> softly) { SoftAssertionsProvider.assertSoftly(SimulationSoftAssert.class, softly); } }
使用自定义软断言
AssertJ SoftAssertion 类负责软断言。这是适用于模拟上下文的示例:
AssertJ SoftAssertion 类负责软断言。这是适用于模拟上下文的示例:
public class SimulationAssert extends AbstractAssert<SimulationAssert, Simulation> { protected SimulationAssert(Simulation actual) { super(actual, SimulationAssert.class); } public static SimulationAssert assertThat(Simulation actual) { return new SimulationAssert(actual); } public SimulationAssert hasValidInstallments() { isNotNull(); if (actual.getInstallments() < 2 || actual.getInstallments() >= 48) { failWithMessage("Installments must be must be equal or greater than 2 and equal or less than 48"); } return this; } public SimulationAssert hasValidAmount() { isNotNull(); var minimum = new BigDecimal("1.000"); var maximum = new BigDecimal("40.000"); if (actual.getAmount().compareTo(minimum) < 0 || actual.getAmount().compareTo(maximum) > 0) { failWithMessage("Amount must be equal or greater than $ 1.000 or equal or less than than $ 40.000"); } return this; } }
使用它的“问题”是我们将无法使用我们创建的自定义断言。在上面的示例中,您可以使用 isEqualTo() 查看分期付款和金额中的断言,因为 SoftAssertions 类无法访问自定义断言。
我们通过创建自定义软断言类解决了这个问题。因此,我们将使用自定义类:SimulationSoftAssert,而不是使用 SoftAssertions 类。
class SimulationsCustomAssertionTest { @Test void simulationErrorAssertion() { var simulation = Simulation.builder().name("John").cpf("9582728395").email("john@gmail.com") .amount(new BigDecimal("1.500")).installments(5).insurance(false).build(); SimulationAssert.assertThat(simulation).hasValidInstallments(); SimulationAssert.assertThat(simulation).hasValidAmount(); } }
SimulationSoftAssert.assertSoftly() 是软断言的提供者,它将调用所有内部方法以便能够在断言期间管理错误和其他活动。在assertSoftly() 内部使用的assertThat() 将是自定义断言,它将可以通过软断言和断言主题之间的proxy() 访问自定义断言。
使用这种方法,我们可以通过实现自定义断言来在软断言中使用自定义断言。
结束
这就是大家!
您可以在credit-api项目中找到一个完全实现且有效的示例,您可以在其中看到以下内容:
- 模拟断言类
- SimulationsCustomAssertionTest 类中的测试用法
以上是优雅断言:使用 AssertJ 实现更简洁的代码的自定义软断言的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...
