断言异常

单元测试在测试错误处理代码方面表现出色。作为测试异常抛出的示例,让我们添加一个业务需求:用户名必须至少为四个字符长。我们思考我们想要的设计,并决定在名称太短时抛出一个自定义异常。我们决定将这个自定义异常表示为 InvalidNameException 类。以下是使用 AssertJ 的测试示例:

@Test
public void rejectsShortName() {
    assertThatExceptionOfType(InvalidNameException.class)
        .isThrownBy(() -> new Username("Abc"));
}

我们可以考虑添加另一个测试,专门用于证明四个字符的名称被接受且不抛出异常:

@Test
public void acceptsMinimumLengthName() {
    assertThatNoException()
        .isThrownBy(() -> new Username("Abcd"));
}

或者,我们可以简单地决定不需要这个显式测试。我们可能通过其他测试隐式覆盖它。添加这两个测试是一个好习惯,以使我们的意图清晰。

测试名称相当通用,以 rejectsaccepts 开头。它们描述了代码正在测试的结果。这允许我们在以后改变错误处理机制的想法,可能切换到异常以外的其他方式来发出错误信号。

单元测试可以捕捉常见的编程错误并验证错误处理逻辑。让我们看看编写单元测试的一个主要原则,以便在实现我们的方法时为我们提供最大的灵活性。