mockito
时间: 2025-05-09 17:18:31 浏览: 25
### 关于 Mockito 的使用教程和示例代码
#### 什么是 Mockito?
Mockito 是一种流行的 Java 测试框架,用于创建模拟对象(mock objects),以便在单元测试中替代真实的依赖项。它允许开发者轻松定义交互行为并验证这些行为。
---
#### 创建 Mock 对象的方法
可以通过多种方式来创建 Mock 对象。以下是两种常见的方法:
1. **通过 `Mockito.mock()` 方法手动创建**
可以直接调用 `Mockito.mock(Class)` 来生成一个替身对象[^3]。
2. **使用 `@Mock` 注解配合 `MockitoAnnotations.initMocks(this)` 初始化**
如果希望简化代码结构,可以利用 `@Mock` 注解标记字段,并在测试类的 `@Before` 方法中调用 `MockitoAnnotations.initMocks(this)` 让注解生效[^4]。
---
#### 验证交互行为
为了验证被测对象与其依赖之间的交互,可以使用以下工具和技术:
1. **ArgumentCaptor**
当需要捕获传递给 mock 方法的实际参数时,可以使用 `ArgumentCaptor` 类。例如,在不适用 `@Captor` 注解的情况下,可以直接通过静态工厂方法 `forClass` 构造实例[^1]。
```java
@Test
public void whenNotUseCaptorAnnotation_thenCorrect() {
List<String> mockList = Mockito.mock(List.class);
// 手动创建 ArgumentCaptor 实例
ArgumentCaptor<String> arg = ArgumentCaptor.forClass(String.class);
mockList.add("one");
Mockito.verify(mockList).add(arg.capture());
assertEquals("one", arg.getValue());
}
```
2. **自动注入的 Captor (推荐)**
使用 `@Captor` 注解可以让 Mockito 自动管理 `ArgumentCaptor` 的生命周期,从而减少样板代码。需要注意的是,这同样需要调用 `MockitoAnnotations.openMocks(this)` 或其变体[^2]。
---
#### 示例:完整的测试案例
假设有一个简单的服务类 `UserService` 和它的依赖接口 `UserRepository`,我们可以编写如下测试代码:
```java
// UserService.java
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public String getUserById(int id) {
return userRepository.findById(id);
}
}
// UserRepository.java
public interface UserRepository {
String findById(int id);
}
```
对应的单元测试实现如下所示:
```java
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
public class UserServiceTest {
@Mock
private UserRepository userRepository;
private UserService userService;
@Before
public void setUp() {
MockitoAnnotations.openMocks(this); // 初始化 @Mock 注解的对象
userService = new UserService(userRepository);
}
@Test
public void testGetUserById() {
int userId = 1;
String expectedUser = "John Doe";
// 定义 mock 行为
when(userRepository.findById(userId)).thenReturn(expectedUser);
// 调用实际逻辑
String actualUser = userService.getUserById(userId);
// 验证返回值
assertEquals(expectedUser, actualUser);
// 验证交互次数
verify(userRepository, times(1)).findById(userId);
}
}
```
上述代码展示了如何设置 Mock 对象的行为以及验证它们的交互情况。
---
#### 常见配置与注意事项
- **初始化 Mocks**
在 JUnit 中通常会将 `MockitoAnnotations.openMocks(this)` 放置到 `@Before` 方法里,确保每次运行测试前都完成必要的初始化工作。
- **版本兼容性**
不同版本的 Mockito 提供的功能可能有所差异,请确认所使用的库版本支持目标特性。例如,较新的 Mockito 版本已经废弃了一些过时 API 并引入了改进功能。
- **异常处理**
若要验证某个操作是否会抛出特定类型的异常,则可借助 `thenThrow` 方法指定预期错误响应。
---
阅读全文
相关推荐

















