Mockito主要用于Java单元测试中隔离外部依赖,聚焦被测类自身逻辑;通过@Mock创建模拟对象、when(...).thenReturn(...)定义行为、verify()验证交互,配合JUnit 5的@ExtendWith(MockitoExtension.class)实现简洁可控的测试。

在 Java 单元测试中,Mockito 主要用于隔离被测类的外部依赖,让测试聚焦于自身逻辑,不依赖真实服务、数据库或网络调用。核心思路是:用 @Mock 创建模拟对象,用 when(...).thenReturn(...) 定义行为,再通过构造注入或 setter 注入到被测对象中。
1. 引入依赖(Maven)
确保项目中已添加 Mockito 和 JUnit 支持:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>5.12.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <scope>test</scope> </dependency>
2. 基本使用三步法
以一个订单服务为例,它依赖 PaymentService 和 InventoryService:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
声明模拟对象:用
@Mock标注字段,配合@ExtendWith(MockitoExtension.class)(JUnit 5)自动初始化 -
定义模拟行为:用
when(mock.method()).thenReturn(value)或thenThrow()控制返回结果 -
注入并验证:通过构造器/Setter 将 mock 对象传入被测类;执行方法后,用
verify()检查是否按预期调用了依赖
3. 实际测试示例
假设 OrderService 要完成下单,需调用支付和扣库存:
立即学习“Java免费学习笔记(深入)”;
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
@Mock
private PaymentService paymentService;
@Mock
private InventoryService inventoryService;
private OrderService orderService;
@BeforeEach
void setUp() {
orderService = new OrderService(paymentService, inventoryService);
}
@Test
void shouldPlaceOrderSuccessfully() {
// 给模拟对象设定行为
when(paymentService.charge("123", 99.9)).thenReturn(true);
when(inventoryService.deduct("SKU001", 1)).thenReturn(true);
// 执行业务逻辑
boolean result = orderService.placeOrder("123", "SKU001", 1);
// 验证结果与交互
assertTrue(result);
verify(paymentService).charge("123", 99.9);
verify(inventoryService).deduct("SKU001", 1);
}
}
4. 常见技巧与注意点
- 用
@InjectMocks可自动将@Mock字段注入被测对象(适合有默认构造器的类),但建议优先显式构造,更清晰可控 - 对 void 方法模拟异常,用
doThrow(new RuntimeException()).when(mock).voidMethod() - 验证调用次数:
verify(mock, times(1)).method()、never()、atLeastOnce() - 避免过度 mock:只 mock 真正的外部边界(如 HTTP 客户端、DAO、第三方 SDK),不要 mock 工具类或简单 POJO

















