@mock和@injectmocks字段为null的根本原因是注解未被正确处理,必须通过@runwith(mockitojunitrunner.class)(junit4)或@extendwith(mockitoextension.class)(junit5)显式启用初始化机制,否则mockito无法注入依赖。

这不是注解“丢失”,而是注解未被正确处理——Mockito 本身不读取或保留 Java 注解,@Mock、@InjectMocks 等只是标记字段用途的“元信息”,必须配合初始化机制才能生效。没有初始化,这些字段就只是 null 引用。
没调用初始化方法或未启用扩展
JUnit 4 和 JUnit 5 的处理方式不同,但核心都是:注解不会自动起作用。
- JUnit 4 中需搭配
@RunWith(MockitoJUnitRunner.class),或手动调用MockitoAnnotations.initMocks(this)(已过时)或更推荐的MockitoAnnotations.openMocks(this) - JUnit 5 中必须使用
@ExtendWith(MockitoExtension.class),否则所有@Mock字段保持为 null - 漏掉任一配置,字段就不会被赋值,看起来就像“注解失效”或“丢失”
导入了错误的注解类
常见低级但致命的问题:IDE 自动导入了错的 @Test 或其他注解。
- 比如误导入
org.junit.jupiter.api.Test却配了 JUnit 4 的 Runner,或反过来 -
@Mock导入成org.mockito.Mock(正确) vsorg.mockito.junit.MockitoJUnit下的类(错误) - 编译通过但运行时无效果,字段仍为 null,容易误判为“注解丢了”
字段被 final 修饰或未声明为可访问
Mockito 默认通过反射设置字段值,对不可变或受限访问的字段会静默失败。
- 如果字段是
private final EncService encService;,且没有构造器注入支持,@InjectMocks将无法注入(也不会报错),导致字段为 null - 字段若被
static修饰,Mockito 完全不处理 —— 这不是丢失注解,而是根本不在 Mockito 的作用范围内 - 某些 Lombok 注解(如
@RequiredArgsConstructor)可能干扰字段发现逻辑,需确认生成的构造器是否包含目标依赖
测试类未由 Mockito 管理上下文加载
在 Spring Boot 测试中混用 @Mock 和 @MockBean 易引发混淆。
-
@Mock是纯 Mockito 注解,只在当前测试实例内有效;它不会注册到 Spring 容器 - 若被测对象是
@Autowired得到的 Spring Bean,而你只用了@Mock,那注入进来的仍是真实 Bean,mock 字段完全没被使用 - 此时看似“@Mock 失效”,实则是 mock 对象压根没参与依赖链 —— 注解还在,只是没走对路径
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











