深入浅出:用MockMvc测Spring Boot,轻松搞定GET、POST、HEAD请求,玩转返回值!
2023-06-23 14:47:38
MockMvc:Spring Boot单测的利器
什么是MockMvc?
MockMvc是一个强大的工具,可用于编写针对Spring Boot应用程序的快速、可靠的单元测试。它允许开发者模拟HTTP请求,从而可以轻松测试控制器、服务层等组件。
为何使用MockMvc进行单元测试?
- 快速和可靠: MockMvc可以快速模拟HTTP请求,并对响应进行断言,从而实现快速和可靠的测试。
- 易于使用: MockMvc的API简洁易用,即使是初学者也能轻松上手。
- 功能齐全: MockMvc提供了各种功能,包括发送GET、POST、HEAD请求,设置请求头,解析JSON和字符串返回值等。
如何使用MockMvc?
要使用MockMvc,需要在测试类中添加以下注解:
@SpringBootTest
@AutoConfigureMockMvc
然后,就可以使用MockMvc发送HTTP请求并对响应进行断言了。
示例:GET请求
@Test
public void testGET() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/api/users"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.[0].name").value("John Doe"));
}
示例:POST请求
@Test
public void testPOST() throws Exception {
User user = new User("John Doe");
String json = new ObjectMapper().writeValueAsString(user);
mockMvc.perform(MockMvcRequestBuilders.post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content(json))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.name").value("John Doe"));
}
示例:HEAD请求
@Test
public void testHEAD() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.head("/api/users"))
.andExpect(status().isOk());
}
示例:设置请求头
@Test
public void testWithHeaders() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/api/users")
.header("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoxNjQ0NjA0NzgwfQ.L8nkqX_xH_jH3dWIFGjpL9y38K2D6NdbPXv-xMWwaM"))
.andExpect(status().isOk()));
}
示例:解析返回值
@Test
public void testParseJSON() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/api/users"))
.andExpect(jsonPath("$.[0].name").value("John Doe"));
}
@Test
public void testParseString() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/api/hello"))
.andExpect(contentAsString("Hello World!"));
}
结论
MockMvc是一个强大的工具,可用于编写针对Spring Boot应用程序的快速、可靠的单元测试。通过使用MockMvc,开发者可以轻松测试应用程序的各个组件,从而提高代码质量和应用程序的稳定性。
常见问题解答
-
MockMvc和RestAssured有什么区别?
MockMvc是一个用于单元测试的工具,而RestAssured是一个用于集成测试的工具。MockMvc运行在JVM中,而RestAssured发送实际HTTP请求。 -
MockMvc是否支持异步请求?
是的,MockMvc支持异步请求。可以使用AsyncResult
类来模拟异步响应。 -
如何使用MockMvc进行多部分文件上传?
可以使用MockMvcRequestBuilders.multipart()
方法发送多部分文件上传请求。 -
如何使用MockMvc测试文件下载?
可以使用MockMvcResponseBuilders.header()
方法设置Content-Disposition头,然后使用MockMvcRequestBuilders.get()
方法发送请求。 -
如何使用MockMvc模拟异常?
可以使用MockMvcBuilders.standaloneSetup()
方法创建控制器实例,然后使用doThrow()
方法模拟异常。