mockito用于测试代码中隔离外部依赖,而非业务代码;需引入test范围依赖,用@mock或mockito.mock()创建模拟对象,配合when/verify验证行为。

在 Java 业务代码的单元测试中,Mockito 主要用于隔离被测类的外部依赖(如 Service、DAO、第三方客户端等),让测试聚焦于自身逻辑。它不用于“业务代码中”,而是用在对应的 测试代码(test 目录下) 中模拟依赖对象的行为。
1. 引入 Mockito 依赖
确保测试依赖已添加(Maven 示例):
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
2. 常见使用方式(在 @Test 方法中)
-
@Mock:声明一个模拟对象,需配合
@ExtendWith(MockitoExtension.class)(JUnit 5)或MockitoAnnotations.openMocks(this)(JUnit 4 或手动初始化) - Mockito.mock():运行时动态创建模拟对象,适合简单场景或需要泛型推断时
- when(...).thenReturn(...):定义方法调用的返回值(支持链式、异常、多次不同响应)
- verify(...).method(...):验证依赖是否按预期被调用(次数、参数、顺序)
3. 典型示例:模拟 Service 依赖
假设有一个 OrderService 依赖 PaymentClient 和 InventoryService:
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
@Mock
private PaymentClient paymentClient;
@Mock
private InventoryService inventoryService;
private OrderService orderService;
@BeforeEach
void setUp() {
orderService = new OrderService(paymentClient, inventoryService);
}
@Test
void shouldPlaceOrderSuccessfully() {
// 给模拟对象设定行为
when(paymentClient.charge("123", BigDecimal.TEN)).thenReturn(true);
when(inventoryService.deduct("itemA", 1)).thenReturn(true);
// 执行业务逻辑
boolean result = orderService.placeOrder("123", "itemA", 1);
// 验证结果和交互
assertTrue(result);
verify(paymentClient).charge("123", BigDecimal.TEN);
verify(inventoryService).deduct("itemA", 1);
}
}
4. 注意事项
- 不要在 main/java 的业务代码里写
Mockito.mock()—— 这违反了依赖注入原则,也破坏可测性与生产稳定性 - 真实对象(如工具类、DTO、实体)一般不需要 mock;优先 mock 接口或抽象类,便于解耦
- 慎用
mock(ConcreteClass.class),除非该类有无参构造且无 final 方法;更推荐面向接口编程 - 避免过度验证(比如 verify 每个 getter),专注验证核心协作行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










