MockMvc
是 Spring MVC 提供的一个用于测试 MVC 层的工具(Mock是模仿的意思,就是模仿Mvc调用)。它允许你发送 HTTP 请求到控制器,并验证响应是否符合预期。下面是一个使用
MockMvc
的例子:
首先,假设你有一个简单的 Spring MVC 控制器
HelloController
:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
现在,你想要编写一个单元测试来验证这个控制器是否按预期工作。你可以使用
MockMvc
来实现这一点:
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHello() throws Exception {
MvcResult mvcResult = mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello, World!"))
.andReturn();
// 你还可以从MvcResult中获取更多信息,比如响应的头部、内容类型等
int status = mvcResult.getResponse().getStatus();
String content = mvcResult.getResponse().getContentAsString();
// 这里可以添加更多的断言来验证响应的内容、状态码等
// 例如:
// assertEquals(200, status);
// assertEquals("Hello, World!", content);
}
}
在这个例子中,
@WebMvcTest(HelloController.class)
注解告诉 Spring Boot 仅加载与
HelloController
相关的组件,创建一个
MockMvc
实例,并自动装配到
HelloControllerTest
测试类中。
在
testHello
方法中,我们使用
mockMvc.perform(get("/hello"))
来模拟发送一个 GET 请求到
/hello
端点。然后,我们使用
andExpect
方法来添加一系列期望条件,验证响应的状态码是否为
200 OK
,以及响应的内容是否为
"Hello, World!"
。
andReturn()
方法用于获取
MvcResult
对象,它包含了响应的详细信息,比如状态码、内容等。虽然在这个例子中我们没有使用
MvcResult
进行进一步的断言,但在实际测试中,你可以根据需要从中提取更多信息来验证响应。
通过使用
MockMvc
,你可以很方便地测试 Spring MVC 控制器的各种场景,包括请求参数、路径变量、异常处理等。这有助于确保你的控制器按预期工作,并提高代码的质量。
MockMvc提供了丰富的方法来模拟HTTP请求和验证响应结果。以下是一些常用的MockMvc方法:
- perform() 方法: - 这是MockMvc的核心方法,用于发送HTTP请求。它接受一个请求构建器(如
MockMvcRequestBuilders.get()
,MockMvcRequestBuilders.post()
等)作为参数,并返回一个ResultActions
对象,该对象可用于进一步对响应进行验证和处理。 - andExpect() 方法: - 这个方法用于添加期望条件,验证响应的结果。它接受一个
ResultMatcher
对象,用于对响应的各种属性(如状态码、内容、头部等)进行断言。例如,status().isOk()
用于验证响应的状态码是否为200。 - andDo() 方法: - 用于添加结果处理器,比如打印日志、记录测试结果等。它接受一个
ResultHandler
对象,可以在请求完成后执行一些自定义的操作。 - andReturn() 方法: - 用于获取请求执行后的
MvcResult
对象,这个对象包含了响应的详细信息,如状态码、响应体、头部等。你可以使用MvcResult
进行更深入的验证或自定义处理。 - 请求构建器(如MockMvcRequestBuilders类的方法): - MockMvc提供了多种静态方法来创建请求对象,如
get()
,post()
,put()
,delete()
等。这些方法允许你指定请求的URL、请求参数、请求头部等信息。
在使用MockMvc时,通常会先使用请求构建器创建一个请求对象,然后使用
perform()
方法发送请求,并通过链式调用的方式使用
andExpect()
添加期望条件,最后可能使用
andReturn()
获取响应结果进行进一步处理或验证。这样,你就可以方便地测试你的Spring MVC控制器,确保它们按照预期工作。
版权归原作者 因上精进,果上随缘 所有, 如有侵权,请联系我们删除。