📜  junit 5 断言异常消息 - Java (1)

📅  最后修改于: 2023-12-03 15:32:26.609000             🧑  作者: Mango

JUnit 5 断言异常消息 - Java

在编写单元测试时,很重要的一项工作就是测试方法的异常情况。JUnit 5 提供了多种方式来断言一个方法是否抛出了期望的异常,其中一个非常实用的断言方式就是断言异常消息。

断言异常消息的方式

在JUnit 5中,我们可以使用assertThrows()方法来断言方法是否抛出了期望的异常,如下所示:

assertThrows(Exception.class, () -> {
    // 此处是我们期望会抛出异常的方法调用
    // ...
}, "期望的异常消息");

其中,第一个参数是期望捕获的异常类型,第二个参数是一个Executable接口的实例,我们可以将我们期望会抛出异常的方法包装成一个lambda表达式传递给该参数。

而第三个参数就是我们要断言的异常消息。如果我们期望捕获的异常和实际捕获的异常类型不一致或者异常消息不符合预期,该断言会失败。

例子

下面是一个例子,我们期望调用getAge()方法会抛出一个IllegalArgumentException异常,并且异常消息为"年龄不能小于0"

class Person {
    private int age;
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        if (age < 0) {
            throw new IllegalArgumentException("年龄不能小于0");
        }
        return age;
    }
}

public class PersonTest {
    @Test
    void testGetAgeThrowsIllegalArgumentExceptionWithExpectedMessage() {
        Person person = new Person();
        person.setAge(-1);
        Throwable exception = assertThrows(IllegalArgumentException.class,
                person::getAge,
                "年龄不能小于0");
        assertEquals("年龄不能小于0", exception.getMessage());
    }
}

在上述测试中,我们先设置了一个Person对象的年龄为-1,然后调用了该对象的getAge()方法,并且断言该方法会抛出一个IllegalArgumentException异常,并且异常消息为"年龄不能小于0"

总结

JUnit 5 的assertThrows()方法可以非常方便地断言一个方法是否抛出了期望的异常,并且可以断言异常消息是否符合预期。在实际的测试场景中,合理利用异常断言可以大大提高代码的覆盖率和测试质量。