如何编写Junit测试验证Java方法是否正确抛出预期异常
结论
你现有的写法不是正确的Junit异常验证方式,存在两处核心问题:
- 测试方法调用
validateName传入null时,方法会直接抛出未捕获的IllegalArgumentException,测试会直接标记失败,assertEquals逻辑根本不会执行 - 代码中的
NameValidator validator仅声明未实例化,调用方法时会先触发空指针异常,连目标业务逻辑都无法执行
正确实现方式
根据你使用的Junit版本选择对应写法即可:
Junit 5(Jupiter,当前主流版本)
使用assertThrows方法,可以同时验证异常类型和异常信息:
@Test public void handlesNullTest() { String name = null; NameValidator validator = new NameValidator(); // 捕获方法抛出的异常 IllegalArgumentException exception = org.junit.jupiter.api.Assertions.assertThrows( IllegalArgumentException.class, () -> validator.validateName(name) ); // 验证异常信息是否符合预期 assertEquals("Name cannot be null", exception.getMessage()); }
Junit 4
如果仅需要验证抛出的异常类型,可以直接给@Test注解加expected属性:
@Test(expected = IllegalArgumentException.class) public void handlesNullTest() { String name = null; NameValidator validator = new NameValidator(); validator.validateName(name); }
如果需要同时验证异常信息,使用ExpectedException规则:
@Rule public ExpectedException thrown = ExpectedException.none(); @Test public void handlesNullTest() { String name = null; NameValidator validator = new NameValidator(); thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Name cannot be null"); validator.validateName(name); }
内容的提问来源于stack exchange,提问作者Rey Cai
相关产品推荐
相关产品推荐

