@InjectMocks 是 Mockito 的依赖注入机制,非 Spring 容器式自动注入,而是基于反射按字段名、类型或构造器参数将 @Mock 对象“缝合”进被测类实例,实现测试上下文隔离。

在 Java 中用 JUnit 结合 Mockito 对依赖服务做 Mock 测试,核心是“隔离被测逻辑、伪造依赖行为、验证交互结果”。不需要启动数据库、不调用真实接口,只专注验证自己写的业务代码是否正确。
明确测试目标和依赖关系
先理清你要测的类(比如 UserServiceImpl)依赖了哪些外部组件(如 UserRepo、EmailService)。这些就是需要被 Mock 的对象。Mockito 不会执行它们的真实逻辑,而是由你定义“当调用某方法时,返回什么”或“抛出什么异常”。
- 真实依赖(数据库、远程接口、消息队列等)一律不接入
- 被测类应通过构造函数或 setter 注入依赖,便于 Mockito 自动注入
- 避免在类中 new 出依赖实例,否则无法被 Mock
配置依赖并启用 Mockito 支持
根据你用的是 JUnit 4 还是 JUnit 5,选择对应集成方式:
-
JUnit 5(推荐):引入
spring-boot-starter-test(已含 Mockito),或单独加:<dependency><groupId>org.mockito</groupId><artifactId>mockito-junit-jupiter</artifactId><scope>test</scope></dependency>
测试类加上@ExtendWith(MockitoExtension.class) -
JUnit 4:需显式引入
junit和mockito-core,并在测试类上加@RunWith(MockitoJUnitRunner.class)
声明模拟对象与被测实例
在测试类中用注解快速构建测试环境:
立即学习“Java免费学习笔记(深入)”;
-
@Mock:为每个依赖创建假对象(如@Mock private UserRepo userRepo;) -
@InjectMocks:创建被测类的真实实例,并自动把@Mock对象注入进去(如@InjectMocks private UserService userService;) - 无需手动 new 或 set,Mockito 在运行时完成依赖装配
定义行为、执行逻辑、验证结果
一个完整测试方法通常三步走:
-
Stub 行为:用
when(...).thenReturn(...)告诉 Mock 对象“调用这个方法时返回什么”
例:when(userRepo.findById(1L)).thenReturn(new User("Alice")); -
触发业务:调用被测方法,获取返回值或观察副作用
例:String result = userService.getUserName(1L); -
断言 + 验证:
• 用assertEquals等检查返回值是否符合预期
• 用verify(userRepo).findById(1L)确认依赖方法确实被调用了一次
不复杂但容易忽略:Mockito 默认对未 stub 的方法返回 null/0/false,所以务必为关键路径提前设定行为;void 方法要用 doThrow().when(...) 来模拟异常。


















