执行mvn test时@Mock注解的对象未初始化触发空指针是什么原因?
问题原因及解决方案
核心原因
你遇到的空指针本质是@Before注解的初始化方法没有被JUnit框架执行,导致@Mock标注的字段没有被Mockito初始化,默认为null。常见的触发场景有以下几种:
- 项目同时引入了JUnit4和JUnit5(Jupiter)相关依赖,maven-surefire插件默认优先使用JUnit5引擎执行测试,此时JUnit4的
@Before、@Test注解不会被识别,初始化逻辑直接被跳过。这是该类问题最高发的原因。 - maven-surefire插件版本过低,和你使用的JUnit 4.13、Mockito 4.0.0版本不兼容,无法正确识别JUnit4的生命周期注解。
- 测试类未放置在项目
src/test/java目录下,或者类命名不符合maven-surefire默认的测试类匹配规则(默认匹配*Test、*Tests、*TestCase后缀的类)。 - 注解导包错误,比如错误导入了JUnit5的
org.junit.jupiter.api.BeforeEach或org.junit.jupiter.api.Test注解,和JUnit4的注解不通用。
对应解决方案
- 优先验证是否是多JUnit版本冲突:直接在测试类上添加
@RunWith(MockitoJUnitRunner.class)注解(需要导入org.mockito.junit.MockitoJUnitRunner包),该注解会强制测试用JUnit4的Mockito运行器执行,同时可以省略手动调用MockitoAnnotations.openMocks(this)的代码,修改后重新执行测试即可验证问题。 - 如果上述方法无效,可以先把
MockitoAnnotations.openMocks(this);代码移到测试方法的第一行,若执行不再报错,则100%确认是@Before方法未被触发,此时检查pom.xml中是否存在JUnit5的多余依赖,排除即可。 - 升级maven-surefire插件到3.0.0及以上版本,适配当前使用的测试框架版本。
- 确认测试类放置在
src/test/java目录下,且命名符合默认匹配规则。
内容的提问来源于stack exchange,提问作者theotheo
相关产品推荐
相关产品推荐

