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

在 Java 单元测试中,Mockito 主要用于隔离被测类的外部依赖,让测试聚焦于自身逻辑,不依赖真实服务、数据库或网络调用。核心思路是:用 @Mock 创建模拟对象,用 when(...).thenReturn(...) 定义行为,再通过构造注入或 setter 注入到被测对象中。
1. 引入依赖(Maven)
确保项目中已添加 Mockito 和 JUnit 支持:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
<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:
-
声明模拟对象:用
@Mock标注字段,配合@ExtendWith(MockitoExtension.class)(JUnit 5)自动初始化 -
定义模拟行为:用
when(mock.method()).thenReturn(value)或thenThrow()控制返回结果 -
注入并验证:通过构造器/Setter 将 mock 对象传入被测类;执行方法后,用
verify()检查是否按预期调用了依赖
3. 实际测试示例
假设 OrderService 要完成下单,需调用支付和扣库存:
@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
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










