JUnit4迁移JUnit5:assertNotThrows转assertDoesNotThrow报错求助
JUnit4
assertNotThrows 迁移到JUnit5的正确方式 问题原因
JUnit5的org.junit.jupiter.api.Assertions.assertDoesNotThrow方法没有提供接收异常Class作为参数的重载版本,这和JUnit4中org.junit.Assert.assertNotThrows的方法签名设计不同,直接替换方法名会导致编译错误。
正确迁移方案
根据你验证「代码块不会抛出特定异常」的需求,有两种实现方式:
方式1:手动捕获特定异常并断言失败
如果只是单次使用,直接在测试代码中捕获目标异常,一旦捕获到就标记测试失败:
try { // 你的业务代码逻辑 } catch (ExceptionNotToThrow e) { Assertions.fail("代码意外抛出了ExceptionNotToThrow异常", e); }
方式2:封装工具方法复用
如果需要在多个测试用例中复用这种逻辑,可以自己封装一个和JUnit4用法一致的工具方法:
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.function.Executable; public class CustomAssertions { public static <T extends Throwable> void assertDoesNotThrow(Class<T> exceptionType, Executable executable) { try { executable.execute(); } catch (Throwable thrown) { if (exceptionType.isInstance(thrown)) { Assertions.fail(String.format("意外抛出了指定异常:%s", exceptionType.getName()), thrown); } // 非目标异常直接抛出,不影响测试的正常失败逻辑 throw thrown; } } }
之后在测试中调用这个工具方法,和原来JUnit4的写法保持一致:
CustomAssertions.assertDoesNotThrow(ExceptionNotToThrow.class, () -> { // 你的业务代码逻辑 });
补充:如果只需验证不抛出任何异常
如果你的需求只是验证代码块不抛出任何异常,直接使用JUnit5原生的assertDoesNotThrow无参重载即可:
Assertions.assertDoesNotThrow(() -> { // 你的业务代码逻辑 });
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

