IntelliJ IDEA中Spring Boot项目JUnit 5 @BeforeAll方法异常无法显示的问题排查及解决方案咨询
JUnit 5 @BeforeAll 异常在IntelliJ IDEA中不显示的问题解决
我最近在Spring Boot 2.6.6 + JUnit 5的项目里踩了个坑,用IntelliJ IDEA 2022.1运行测试时,@BeforeAll方法抛出的异常居然不会被IDE直接显示出来!不管是单独跑这个测试类,还是跑单个测试方法,都看不到异常提示,只有偶然跑整个测试包的时候,才会发现测试失败了,这和JUnit 4里@Before异常直接弹出来的体验差太远了,尤其是@BeforeAll里逻辑复杂的时候,排查问题特别费劲。
复现代码
先贴一下我用来复现的测试类:
@ExtendWith(SpringExtension.class) public class SpringTest { private Object OBJECT = new Object(); @BeforeAll public static void before() { throw new RuntimeException("SpringTest.RuntimeException"); // 模拟业务代码抛出异常 } @Test public void test() { assertNotNull(this.OBJECT); } }
我的项目只引入了spring-boot-starter和spring-boot-starter-test依赖,运行环境是OpenJDK 11 Temurin(11.0.14.1)、Maven 3.8.4。
关键差异说明
这里要提一下,JUnit 5的@BeforeEach(对应JUnit 4的@Before)是正常的——如果用这个注解的方法抛出异常,IDEA会直接显示测试失败和完整的异常堆栈,哪怕单独跑测试类也能看到。只有@BeforeAll的异常会被IDE“隐藏”。
临时应对方案
目前这个问题已经被提交为官方Bug,在官方修复之前,我总结了几个临时能用的办法:
- 替换注解:如果你的初始化逻辑不需要严格的全局单次执行,可以把
@BeforeAll换成@BeforeEach,这样异常就能正常显示了; - 手动加日志:在
@BeforeAll的关键步骤里添加控制台输出,比如用System.err.println()打印异常信息,或者用SLF4J日志框架记录,这样即使IDE不显示,也能在控制台里找到报错; - 跑整个测试包:虽然麻烦,但运行整个测试包的时候,IDE会汇总所有测试结果,这时候就能看到
@BeforeAll抛出的异常导致的测试失败了。
内容的提问来源于stack exchange,提问作者Bapt_
相关产品推荐
相关产品推荐

