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类)可以精确匹配异常抛出的位置 防止被其他代码块抛出同样的异常而误导单测结果。
原文地址:
2.JUnit 判断 是否有异常抛出 异常类型是否正确 以及 异常的message 是否正确