在AssertJ断言中使用条件

Using Conditions with AssertJ Assertions

1.概述

在本教程中,我们将研究AssertJ库,特别是在定义和使用条件来创建可读和可维护的测试方面。

可以在这里找到AssertJ的基础知识。

2.被测课程

让我们看一下将针对其编写测试用例的目标类:

1
2
3
4
5
6
public class Member {
    private String name;
    private int age;

    // constructors and getters
}

3.创建条件

我们可以通过简单地使用适当的参数实例化Condition类来定义断言条件。

创建条件的最方便方法是使用将谓词作为参数的构造函数。其他构造函数要求我们创建一个子类并覆盖matchs方法,该方法不太方便。

在构造一个Condition对象时,我们必须指定一个type参数,这是根据条件求值的值的类型。

让我们为会员类的年龄字段声明一个条件:

1
2
Condition<Member> senior = new Condition<>(
  m -> m.getAge() >= 60,"senior");

现在,高级变量引用了一个Condition实例,该实例根据人员的年龄测试人员是否为高级。

构造函数的第二个参数是字符串" senior",是简短描述,如果条件失败,AssertJ自身将使用它来构建用户友好的错误消息。

检查人员是否具有名称" John"的另一个条件如下所示:

1
2
3
4
Condition<Member> nameJohn = new Condition<>(
  m -> m.getName().equalsIgnoreCase("John"),
 "name John"
);

4.测试用例

现在,让我们看看如何在我们的测试类中使用Condition对象。假设条件条件高级和姓名约翰可作为测试类中的字段使用。

4.1。声明标量值

当年龄值高于资历阈值时,以下测试应通过:

1
2
Member member = new Member("John", 65);
assertThat(member).is(senior);

由于使用is方法的断言通过,因此使用带有相同参数的isNot的断言将失败:

1
2
// assertion fails with an error message containing"not to be <senior>"
assertThat(member).isNot(senior);

使用nameJohn变量,我们可以编写两个类似的测试:

1
2
3
4
5
6
Member member = new Member("Jane", 60);
assertThat(member).doesNotHave(nameJohn);

// assertion fails with an error message containing"to have:
 <name John>"
assertThat(member).has(nameJohn);

is和has方法以及isNot和dosNotHave方法具有相同的语义。我们使用的只是选择问题。但是,建议选择一种使我们的测试代码更具可读性的代码。

4.2。主张收藏

条件不仅适用于标量值,而且还可以验证集合中元素的存在或不存在。让我们看一个测试用例:

1
2
3
4
5
6
List<Member> members = new ArrayList<>();
members.add(new Member("Alice", 50));
members.add(new Member("Bob", 60));

assertThat(members).haveExactly(1, senior);
assertThat(members).doNotHave(nameJohn);

haveExactly方法断言满足给定条件的元素的确切数量,而doNotHave方法检查是否存在元素。

并不是唯一具有收集条件的方法hasExactly和doNotHave。有关这些方法的完整列表,请参见API文档中的AbstractIterableAssert类。

4.3。合并条件

我们可以使用Assertions类的三种静态方法来组合各种条件:

  • not –如果不满足指定条件,则创建满足条件

  • allOf –仅在满足所有指定条件时创建一个条件

  • anyOf –创建至少满足指定条件之一的条件

  • 以下是not和allOf方法可用于组合条件的方法:

    1
    2
    3
    4
    5
    Member john = new Member("John", 60);
    Member jane = new Member("Jane", 50);
           
    assertThat(john).is(allOf(senior, nameJohn));
    assertThat(jane).is(allOf(not(nameJohn), not(senior)));

    同样,我们可以使用anyOf:

    1
    2
    3
    4
    5
    Member john = new Member("John", 50);
    Member jane = new Member("Jane", 60);
           
    assertThat(john).is(anyOf(senior, nameJohn));
    assertThat(jane).is(anyOf(nameJohn, senior));

    5.结论

    本教程提供了有关AssertJ条件以及如何使用它们在测试代码中创建可读性强的断言的指南。

    可以在GitHub上找到所有示例和代码段的实现。