使用@TempDir注解实例变量时出现NullPointerException问题排查
@TempDir实例变量在Maven终端运行时为null的原因解析
问题根源
这事儿本质是Maven Surefire插件版本太低。Junit Jupiter 5.9.x要求Surefire插件至少用3.0.0-M5版本,而Maven默认自带的旧版Surefire(比如2.x系列)压根不支持把@TempDir注入到实例变量里,只能认方法参数注入的形式。
IDEA能跑通是因为它自己有适配Junit 5新特性的测试运行器,不依赖Maven的Surefire插件版本;但终端用mvn test跑的时候,用的是项目里配置的Surefire版本(没显式指定的话就用Maven默认的旧版),旧版不支持实例变量级的@TempDir注入,所以tempDir就成null了。
解决办法
在POM里显式指定新版的Surefire插件就行,比如:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> <!-- 只要是3.0.0-M5及以上版本都可以 --> </plugin> </plugins> </build>
加完之后再用终端跑mvn test,实例变量上的@TempDir就能正常注入临时目录了。
额外说明
- Junit 5从5.4版本开始支持
@TempDir注入到实例变量,但这个特性需要构建工具的测试插件跟上版本。 - 旧版Surefire只认
@TempDir作为方法参数的写法,这就是为啥你把注解移到方法参数后,IDEA和终端都能正常跑的原因——这个用法在旧插件里是兼容的。
内容的提问来源于stack exchange,提问作者jkc
相关产品推荐
相关产品推荐

