You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:54:54