使用JUnit测试预期异常

Junit单测

1.被单测的类

/**
 * 被测试类
 */
public class Student {
    public boolean canVote(int age) {
        if (age <= 0) throw new IllegalArgumentException("年龄必须大于0");
        if(age >= 150 ) throw new IllegalArgumentException("年龄必须小于等于150");
        if (age <18) return false;
        else return true;
    }
}

2.使用@Test(expected ...)注解

@Test注解有个一个可选的参数,“expected”允许你设置一个Throwable的子类。如果你想要验证上面的canVote方法抛出预期的异常,我们可以这样写:

    @Test(expected = IllegalArgumentException.class)
    public void canVote_throws_IllegalArgumentException_for_zero_age() {
        Student student = new Student();
        student.canVote(0);
    }

3.ExpectedException

使用JUnit框架中的ExpectedException类,可以调用时抛出的异常和异常的message进行精确的匹配,如果被单测方法没有抛出异常、抛出的异常类型不正确、抛出的异常的message不正确都将会被认为失败。使用ExpectedException类需要声明ExpectedException异常。

    @Rule
    public ExpectedException thrown = ExpectedException.none();

有了上述的声明,就可以在单测方法里以更加简单的方式验证预期的异常:

    @Test
    public void canVote_throws_IllegalArgumentException_for_zero_age2() {
        Student student = new Student();
        thrown.expect(IllegalArgumentException.class);
        thrown.expectMessage("年龄必须大于0"); //设置预期异常的message,传入的字符串不要求 “刚好匹配”,而是只要 “被包含” 就算成功。
        student.canVote(0);
    }

使用ExpectedException类不仅仅可以更加精确的对异常的属性信息进行匹配,还可以更加精确的找到异常抛出的位置,比如上面的单测方法,如果不是在调用canVote方法抛出异常,而是在初始化 Student对象抛出异常,将会引起测试失败。thrown.expect放在哪行,就表明预期该行以下的代码段将会抛出预期异常。这样精确的测试代码块,避免被其他与考虑到但是抛出同类型异常的代码段误导单测结果。

4.使用junit.Assert.fail进行异常测试

测试点:没有抛出异常或者抛出的异常类型不正确

    @Test
    public void canVote_throws_IllegalArgumentException_for_zero_age3() {

        try {
            Student student = new Student();
            student.canVote(0);
            fail("年龄必须大于0");
        } catch (IllegalArgumentException ex) {
            assertThat(ex.getMessage(), containsString("年龄必须大于0"));
            assertTrue(ex instanceof  IllegalArgumentException);
        }
    }

 总结:

 个人倾向于第三种方法(使用ExpectedException类)可以精确匹配异常抛出的位置 防止被其他代码块抛出同样的异常而误导单测结果。

原文地址:

 1. 使用JUnit测试预期异常

 2.JUnit 判断 是否有异常抛出 异常类型是否正确 以及 异常的message 是否正确

 

原文地址:https://www.cnblogs.com/boothsun/p/5713523.html