首页 > Java > java教程 > 正文

优雅断言:使用 AssertJ 实现更简洁的代码的自定义软断言

Mary-Kate Olsen
发布: 2024-11-23 09:11:35
原创
452 人浏览过

Assert with Grace: Custom Soft Assertions using AssertJ for Cleaner Code

介绍

如果您不知道什么是软断言,请阅读软断言 – 为什么应该将它们用于单元和集成测试?

本文是 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 作为自定义软断言。步骤如下:

  1. 扩展 AbstractSoftAssertions 类
  2. 使用以下命令创建assertThat()方法:
    • 该方法返回一个对象作为自定义断言类
    • 断言主题的参数
    • 该方法返回方法代理,其中参数是自定义断言类和断言的主题
  3. 使用以下命令创建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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板