前后端 Mock 技术实践指南【大模型总结】
前后端 Mock 技术实践指南
目录
- 前端 Mock 解决方案
- 后端 Java Mock 技术
- 方法参数详解
- 工具选型建议
- Spring Boot 项目示例
- 常见问题排查
- 参考资料
一、前端 Mock 解决方案
1.1 Mock.js 轻量级数据模拟
// 基础使用示例
Mock.mock('/api/users', 'get', {
'data|5-10': [{
'id|+1': 1,
'name': '@cname',
'email': '@email'
}]
});
核心特性:
- 声明式数据模板语法
- 支持 7 大类随机数据生成规则
- 拦截 Ajax 请求命中率 100%
1.2 MSW 现代请求拦截方案
// 高级用例:带身份验证的模拟
rest.post('/login', (req, res, ctx) => {
const { username, password } = req.body;
return password === '123456'
? res(ctx.json({ token: 'mock-jwt-token' }))
: res(ctx.status(401));
});
优势对比:
特性 | Mock.js | MSW |
---|---|---|
请求拦截 | Ajax | 所有HTTP |
生命周期管理 | 手动 | Service Worker |
多环境支持 | 浏览器 | 浏览器/Node |
二、后端 Java Mock 技术
2.1 WireMock 服务模拟
// 精确匹配场景配置
stubFor(post(urlPathEqualTo("/v1/payments"))
.withHeader("Authorization", containing("Bearer "))
.withRequestBody(matchingJsonPath("$.amount"))
.willReturn(okJson("{ \"status\": \"processed\" }")));
企业级特性:
- 支持 HTTPS 双向认证模拟
- 请求录制与回放功能
- 故障注入(延迟响应、随机断开)
2.2 Mockito 单元测试框架
// 验证数据库调用行为
@Mock
UserRepository userRepo;
@Test
void shouldSaveUserTwice() {
User user = new User("test");
service.createUser(user);
verify(userRepo, times(2)).save(user);
}
高级用法:
// 参数捕获验证
ArgumentCaptor<User> userCaptor = ArgumentCaptor.forClass(User.class);
verify(userRepo).save(userCaptor.capture());
assertEquals("updated", userCaptor.getValue().getStatus());
三、方法参数详解
3.1 WireMock 核心参数
方法链 | 作用域 | 示例值 |
---|---|---|
.withHeader() | 请求头匹配 | equalTo("Content-Type", "application/json") |
.withQueryParam() | URL参数匹配 | equalTo("page", "2") |
.withRequestBody() | 请求体匹配 | containing("errorFlag") |
3.2 Mockito 参数匹配器
匹配器 | 等效表达式 |
---|---|
anyInt() | 任何整数 |
argThat(λ) | 自定义断言 |
isA(User.class) | 类型匹配 |
四、工具选型建议
4.1 技术矩阵
场景 | 推荐工具 | 优势点 |
---|---|---|
前端开发数据模拟 | MSW | 无侵入式/支持GraphQL |
微服务集成测试 | WireMock | 支持HTTP协议全特性模拟 |
DAO层单元测试 | Mockito+JUnit5 | 精准行为验证 |
4.2 性能考量
- WireMock:单实例可处理 2000+ QPS
- Mockito:内存级调用,纳秒级响应
- MSW:浏览器开销增加约 15% 内存占用
五、Spring Boot 项目示例
5.1 标准项目结构
src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ ├── controller/
│ │ ├── service/
│ │ └── Application.java
│ └── resources/
│ └── application.yml
└── test/
└── java/
└── com/
└── example/
├── controller/
└── service/
5.2 集成测试配置
@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void shouldReturnUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(jsonPath("$.name").value("Test User"));
}
}
六、常见问题排查
6.1 问题诊断表
现象 | 可能原因 | 排查手段 |
---|---|---|
Mock数据未生效 | 拦截路径不匹配 | 检查浏览器开发者工具网络请求 |
单元测试NPE | 未初始化Mock对象 | 添加@RunWith(MockitoJUnitRunner.class) |
响应延迟过高 | 未关闭真实数据库连接 | 使用@MockBean替换真实Bean |
七、参考资料
7.1 官方资源
- WireMock 企业级最佳实践
- Mockito 3.12 新特性解析
- Spring Testing 官方指南
7.2 推荐书目
- 《Java测试驱动开发》- 人民邮电出版社
- 《微服务测试实战》- O’Reilly
文档输出建议:
- 保存为
MOCK_IMPLEMENTATION_GUIDE.md
供团队共享 - 使用
docsify
生成可搜索的网页文档 - 重要方法可提取为代码片段存入项目
snippets/
目录