断言异常
单元测试在测试错误处理代码方面表现出色。作为测试异常抛出的示例,让我们添加一个业务需求:用户名必须至少为四个字符长。我们思考我们想要的设计,并决定在名称太短时抛出一个自定义异常。我们决定将这个自定义异常表示为 InvalidNameException
类。以下是使用 AssertJ 的测试示例:
@Test
public void rejectsShortName() {
assertThatExceptionOfType(InvalidNameException.class)
.isThrownBy(() -> new Username("Abc"));
}
我们可以考虑添加另一个测试,专门用于证明四个字符的名称被接受且不抛出异常:
@Test
public void acceptsMinimumLengthName() {
assertThatNoException()
.isThrownBy(() -> new Username("Abcd"));
}
或者,我们可以简单地决定不需要这个显式测试。我们可能通过其他测试隐式覆盖它。添加这两个测试是一个好习惯,以使我们的意图清晰。
测试名称相当通用,以 rejects
或 accepts
开头。它们描述了代码正在测试的结果。这允许我们在以后改变错误处理机制的想法,可能切换到异常以外的其他方式来发出错误信号。
单元测试可以捕捉常见的编程错误并验证错误处理逻辑。让我们看看编写单元测试的一个主要原则,以便在实现我们的方法时为我们提供最大的灵活性。