junit报assertexception_使用JUnit测试预期异常

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类)可以精确匹配异常抛出的位置 防止被其他代码块抛出同样的异常而误导单测结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值