Junit单测
1.被单测的类
/*** 被测试类*/
public classStudent {public boolean canVote(intage) {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 voidcanVote_throws_IllegalArgumentException_for_zero_age() {
Student student= newStudent();
student.canVote(0);
}
3.ExpectedException
使用JUnit框架中的ExpectedException类,可以调用时抛出的异常和异常的message进行精确的匹配,如果被单测方法没有抛出异常、抛出的异常类型不正确、抛出的异常的message不正确都将会被认为失败。使用ExpectedException类需要声明ExpectedException异常。
@Rulepublic ExpectedException thrown = ExpectedException.none();
有了上述的声明,就可以在单测方法里以更加简单的方式验证预期的异常:
@Testpublic voidcanVote_throws_IllegalArgumentException_for_zero_age2() {
Student student= newStudent();
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("年龄必须大于0"); //设置预期异常的message,传入的字符串不要求 “刚好匹配”,而是只要 “被包含” 就算成功。
student.canVote(0);
}
使用ExpectedException类不仅仅可以更加精确的对异常的属性信息进行匹配,还可以更加精确的找到异常抛出的位置,比如上面的单测方法,如果不是在调用canVote方法抛出异常,而是在初始化 Student对象抛出异常,将会引起测试失败。thrown.expect放在哪行,就表明预期该行以下的代码段将会抛出预期异常。这样精确的测试代码块,避免被其他与考虑到但是抛出同类型异常的代码段误导单测结果。
4.使用junit.Assert.fail进行异常测试
测试点:没有抛出异常或者抛出的异常类型不正确
@Testpublic voidcanVote_throws_IllegalArgumentException_for_zero_age3() {try{
Student student= newStudent();
student.canVote(0);
fail("年龄必须大于0");
}catch(IllegalArgumentException ex) {
assertThat(ex.getMessage(), containsString("年龄必须大于0"));
assertTrue(exinstanceofIllegalArgumentException);
}
}
总结:
个人倾向于第三种方法(使用ExpectedException类)可以精确匹配异常抛出的位置 防止被其他代码块抛出同样的异常而误导单测结果。