将条件与 AssertJ 断言结合使用
1. 概述
在本教程中,我们将了解AssertJ 库 ,尤其是定义和使用条件来创建可读和可维护的测试。
可以在这里 找到 AssertJ 基础知识。
2. 被测类
让我们看一下我们将针对其编写测试用例的目标类:
public class Member {
private String name;
private int age;
// constructors and getters
}
3. 创造条件
我们可以通过简单地使用适当的参数实例化Condition类来定义断言条件。
创建Condition最方便的方法是使用以Predicate作为参数的构造函数。其他构造函数要求我们创建一个子类并覆盖matches方法,这不太方便。
在构造Condition对象时,我们必须指定一个类型参数,它是评估条件的值的类型。
让我们为Member类的age字段声明一个条件:
Condition<Member> senior = new Condition<>(
m -> m.getAge() >= 60, "senior");
Senior变量现在引用一个Condition实例,该实例根据Person的age来测试它是否是 Senior 。
**构造函数的第二个参数String “senior”是一个简短的描述,如果条件失败,AssertJ 本身将使用它来构建用户友好的错误消息。
另一个条件,检查一个*Person 是否有name *“John”,看起来像这样:
Condition<Member> nameJohn = new Condition<>(
m -> m.getName().equalsIgnoreCase("John"),
"name John"
);
4. 测试用例
现在,让我们看看如何在我们的测试类中使用Condition对象。假设条件Senior和nameJohn在我们的测试类中作为字段可用。
4.1. 断言标量值
当*age *值高于资历阈值时,应通过以下测试:
Member member = new Member("John", 65);
assertThat(member).is(senior);
由于使用is方法的断言通过,使用isNot的断言与相同的参数将失败:
// assertion fails with an error message containing "not to be <senior>"
assertThat(member).isNot(senior);
使用nameJohn变量,我们可以编写两个类似的测试:
Member member = new Member("Jane", 60);
assertThat(member).doesNotHave(nameJohn);
// assertion fails with an error message containing "to have:\n <name John>"
assertThat(member).has(nameJohn);
is和has方法,以及isNot和doesNotHave方法具有相同的语义**。我们使用哪个只是一个选择问题。尽管如此,还是建议选择让我们的测试代码更具可读性的那个。
4.2. 断言集合
条件不仅适用于标量值,**还可以验证集合中元素的存在或不存在。**我们来看一个测试用例:
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方法断言满足给定**Condition的元素的确切数量,而doNotHave方法检查是否缺少元素。
方法haveExactly和doNotHave并不是唯一处理收集条件的方法。有关这些方法的完整列表,请参阅API 文档中的 AbstractIterableAssert 类 。
4.3. 组合条件
我们可以使用Assertions类的三个静态方法来组合各种条件:
- not – 如果不满足指定条件,则创建满足条件
- allOf – 创建一个仅在满足所有指定条件时才满足的条件
- anyOf – 如果至少满足一个指定条件,则创建一个条件
下面是如何使用not和allOf方法来组合条件:
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:
Member john = new Member("John", 50);
Member jane = new Member("Jane", 60);
assertThat(john).is(anyOf(senior, nameJohn));
assertThat(jane).is(anyOf(nameJohn, senior));