📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
你是否也曾以为,用Postman批量导入CSV、跑一遍接口集合,就等同于“自动化测试”,直到线上BUG迎面痛击,才惊觉自欺欺人?
事情是这样的,在一次项目上线中,出现了“订单支付崩了,用户支付完不跳转”的严重BUG。后经排查,库存接口返回了{stock: -1},原来是Postman只验证了状态码200,却没检查数据合理性!
必须承认,Postman在手动调试与接口探索中功不可没。但它终究是一个优秀的 “外部”工具,难以融入开发流程。
那么,如何才能实现真正的接口自动化测试,从代码层面精准根除这类隐患?今天就给大家介绍一款在Spring框架中内置的测试神器--MockMvc,让接口测试的真自动化,从代码层根治!
阅读本文你将收获:
-
什么是MockMvc;
-
MockMvc VS postman优势;
-
MockMvc安装及5大高阶使用技巧;
-
MockMvc成果展示。
01 什么是MockMvc
MockMvc是Spring Test框架的一部分,它允许你在不启动完整Servlet容器(如Tomcat)的情况下,对Controller层进行高度仿真的测试。通常用于单元测试或集成测试Web层的接口测试。
02 MockMvc VS postman优势
在学习MockMvc的优势之前,我们先来看看Postman的痛点:
Postman3大伪自动化
痛点1:断言模糊导致线上重大事故
Postman的tests['Body matches']只能模糊搜关键词,遇到{code:0, data:null}这种表面正常、实际异常的数据,直接放行!
痛点2:参数依赖靠人肉
“先登录拿token,再下单”这种链路,Postmon要手动提取cookie塞到下一个请求。
痛点3:回归效率堪比蜗牛
50个接口的集合,Postman跑完要2分钟。MockMvc直接JUnit集成,200个测试用例10秒跑完!
了解完Postman的痛点,我们再一起来看看MockMvc的狠在哪里?
MockMvc的狠总结一句话就是:代码级精准打击。从一种被动、滞后、依赖人力的手工检查,转变为一种主动、前置、可自动执行的、与代码共生的精准验证机制。它让测试真正成为了确保代码质量和安全性的第一道防线,而非最后一道脆弱的关卡。
优势如下:
MockMvc的3大优势
优势1:自动断言响应,拒绝“表面成功”陷阱
案例场景:测试一个查询订单详情的接口,确保核心数据不被篡改。
MockMvc 实战:
mockMvc.perform(get("/order/456"))
.andExpect(jsonPath("$.data.price").value(100.0)) // 精确断言金额
.andExpect(jsonPath("$.data.status").value("PAID")); // 精确断言状态
价值:即使接口返回了正确的HTTP状态码(200),MockMvc也能深入校验核心业务数据(如金额、状态)是否绝对准确,防止因后台逻辑错误或数据污染导致返回错误数据。
优势2:精准风控,将漏洞扼杀于编码阶段
案例场景:测试一个需要“管理员”权限才能访问的用户删除接口 /deleteUser/{id}。
MockMvc 实战:
// 使用一个普通用户的Token来尝试请求
mockMvc.perform(delete("/deleteUser/123")
.header("Authorization", "Bearer ordinary_user_token"))
.andExpect(status().isForbidden()); // 精确断言:必须返回403无权限
价值:通过代码强制验证权限控制是否生效,避免在Postman中因手动更换Token繁琐而疏于测试,导致越权漏洞上线。
优势3:轻松模拟一切异常
案例场景:测试一个依赖外部“短信服务”的注册接口,当短信服务不可用时,系统应优雅降级。
MockMvc 实战:
// 模拟短信服务抛出连接超时异常
when(smsService.sendVerificationCode(anyString())).thenThrow(new ConnectTimeoutException());
mockMvc.perform(post("/register")
.param("phone", "13800138000"))
.andExpect(status().isOk()) // 服务虽降级,但请求本身应成功处理
.andExpect(jsonPath("$.code").value(2001)); // 但返回特定code,告知“短信发送失败,请重试”
价值:在IDE内即可轻松模拟任何依赖的第三方服务(如支付、征信、短信)出现故障的场景,验证自身系统的容错和降级能力,这是手动测试难以覆盖的“角落”。
MockMvc VS Postmon的核心能力对比,如下图:

03 MockMvc配置及5大高级技巧
MockMvc配置
1. 引入Spring Boot测试依赖
<!-- 核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 可选JSON处理 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.41</version>
</dependency>
2. 基础测试类配置
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class})
@AutoConfigureMockMvc
@Slf4j
public class ControllerTestBase {
@Autowired
protected MockMvc mockMvc;
// 全局初始化代码...
}
MockMvc的5大高级技巧
技巧1:会话状态模拟
@Test
public void testWithSession() throws Exception {
mockMvc.perform(get("/cart")
.sessionAttr("user", new User("testUser")))
.andExpect(model().attributeExists("items"));
}
技巧2:OAuth2认证模拟
@Test
public void testOAuth2() throws Exception {
mockMvc.perform(get("/secure")
.with(oauth2Authentication()))
.andExpect(status().isOk());
}
技巧3:响应时间断言
@Test
public void testPerformance() throws Exception {
mockMvc.perform(get("/slow-api"))
.andExpect(request().asyncStarted())
.andExpect(request().asyncResult(notNullValue()))
.andExpect(status().isOk())
.andExpect(time().lessThan(2000L)); // 响应<2秒
}
技巧4:自定义内容匹配器
@Test
public void testCustomMatcher() throws Exception {
mockMvc.perform(get("/custom"))
.andExpect(content().string(new CustomMatcher()));
}
static class CustomMatcher extends BaseMatcher<String> {
@Override
public boolean matches(Object actual) {
return ((String)actual).contains("SPECIAL_FLAG");
}
}
技巧5:JSON Schema验证
@Test
public void testJsonSchema() throws Exception {
mockMvc.perform(get("/json-api"))
.andExpect(jsonPath("$").isMap())
.andExpect(jsonPath("$.id").isNumber())
.andExpect(jsonPath("$.name").isString())
.andExpect(jsonPath("$.items").isArray());
}
04 MockMvc成果展示
成果展示:
有一位大佬在实践的过程中,将postman替换成MockMvc,BUG逃逸率直降76%。
下图是他分层覆盖的一张截图:

对此,你看好MockMvc工具吗?它的“用代码治代码”的真正自动化理念你认同吗?
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】


被折叠的 条评论
为什么被折叠?



