Java分支条件测试中JUnit不识别expected属性如何校验null入参异常
问题根因
@Test注解的expected属性无法识别,是JUnit版本混用导致的API不匹配:
- 你导入的
org.junit.jupiter.api.Test属于JUnit 5(Jupiter)版本的注解,这个版本从设计上就移除了expected属性,异常校验统一交给专用的断言方法实现。expected是JUnit 4版本org.junit.Test注解的专属属性,两个版本的注解不能混着用。 - 你写的测试类本身还有两处语法问题:包声明行末尾缺少分号,静态导入的JUnit包路径和JUnit5的类路径不匹配,直接运行也会报错。
适配JUnit5的正确测试实现(满足分支条件覆盖要求)
JUnit 5提供了assertThrows断言方法实现异常校验,你只需要分别编写两个测试用例,覆盖if判断里的两个独立条件,就能完成全部分支&条件的测试覆盖,完整测试代码如下:
package testing; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertThrows; class Exercise1Test { // 覆盖入参为null的条件分支 @Test void testNullInputThrowsException() { assertThrows(IllegalArgumentException.class, () -> new Exercise1(null)); } // 覆盖入参为空字符串(长度为0)的条件分支 @Test void testEmptyStringInputThrowsException() { assertThrows(IllegalArgumentException.class, () -> new Exercise1("")); } }
写法说明
- 所有导入统一使用JUnit 5(Jupiter)的包路径,不要混入JUnit4的类,避免版本冲突。
assertThrows方法第一个参数传入预期捕获的异常类型,第二个参数传入待执行业务逻辑的lambda表达式:如果逻辑执行时抛出了对应类型的异常,断言通过;如果没抛出异常、或者抛出的异常类型不匹配,测试直接失败。- 两个测试用例分别对应判定逻辑里的两个独立条件,完全满足分支&条件测试的覆盖要求:
testNullInputThrowsException覆盖s == null为真的分支testEmptyStringInputThrowsException覆盖s.length() == 0为真的分支
- 你可以再补充一个传入非空正常字符串的测试用例,覆盖条件不命中、正常给成员变量赋值的剩余路径,即可实现该段代码100%的分支覆盖。
补充提示:你待测代码里抛出异常的提示信息存在拼写错误,lenght应为length,可以顺手修正避免误导。
如果你坚持要使用
expected属性的写法,需要把项目测试依赖全部切换为JUnit 4,导入org.junit.Test注解即可,但目前更推荐使用JUnit5的标准断言写法,扩展性更强,后续还可以追加异常提示信息、异常触发原因的校验逻辑。
内容的提问来源于stack exchange,提问作者FilResto
相关产品推荐
相关产品推荐

