MockMvc是Spring MVC中提供的用于模拟HTTP请求和测试控制器的工具类。通过使用MockMvc,可以方便地对控制器的处理方法进行测试,验证其是否按照预期进行处理并返回正确的响应结果。
在使用MockMvc前,需要先通过MockMvcBuilders类的静态方法创建MockMvc对象。创建MockMvc对象时,可以指定要测试的控制器实例,也可以使用StandaloneMockMvcBuilder类的各种方法配置MockMvc对象。配置完成后,就可以使用MockMvc对象来发送HTTP请求和验证响应结果了。
MockMvc支持各种HTTP请求方式,例如GET、POST、PUT、DELETE等,可以使用MockMvcRequestBuilders类的静态方法创建请求对象。创建请求对象时,可以指定请求的URL、请求参数、请求头部等信息。创建完成后,可以使用MockMvc对象的perform方法发送请求,并获取响应结果。
MockMvc对象的perform方法返回一个ResultActions对象,可以使用该对象的各种方法对响应结果进行验证。例如,可以使用status方法验证响应状态码是否正确,使用content方法验证响应内容是否正确,使用jsonPath方法对JSON格式的响应结果进行解析和匹配等。
除了对控制器的处理方法进行测试外,MockMvc还可以用于测试各种过滤器、拦截器等Spring MVC中的组件。在测试过程中,可以使用MockMvc提供的各种方法对请求和响应进行模拟和验证,从而保证系统的正确性和稳定性。
总的来说,MockMvc是Spring MVC中一个非常重要和实用的测试工具,可以帮助开发者快速进行控制器的单元测试和集成测试。在使用MockMvc时,需要熟悉其各种方法和API,以便能够充分利用其功能和特性,提高测试效率和测试质量。
实体类:
package com.roncoo.education.bean; import java.util.Date; /** * 实体类 * * @author wujing */ public class User { private int id; private String name; private String date; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } }
控制台
package com.roncoo.education.controller; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.roncoo.education.bean.User; /** * spring-boot-demo-2-1 * * @author wujing */ @RestController @RequestMapping(value = "/index") public class IndexController { @RequestMapping public String index() { return "hello world"; } // @RequestParam 简单类型的绑定,可以出来get和post @RequestMapping(value = "/get") public HashMap<String, Object> get(@RequestParam String name) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("title", "hello world"); map.put("name", name); System.out.println("map的值"+map); return map; } // @PathVariable 获得请求url中的动态参数 @RequestMapping(value = "/get/{id}/{name}") public User getUser(@PathVariable int id, @PathVariable String name) { User user = new User(); user.setId(id); user.setName(name); String le = "aabb"; user.setDate(le); System.out.println("user的值"+user.getDate()); return user; } }
测试类:
package com.roncoo.education; 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; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import com.roncoo.education.controller.IndexController; import java.text.SimpleDateFormat; import java.util.Date; @RunWith(SpringRunner.class) @SpringBootTest public class SpringBootDemo21ApplicationTests { //因此可以通过MockMVC来模拟HTTP请求。基于RESTful风格的SpringMVC的测试,我们可以测试完整的Spring MVC流程, // 即从URL请求到控制器处理,再到视图渲染都可以测试。 private MockMvc mvc; @Before public void setup() { //这段代码创建了一个MockMvc实例,用于对IndexController进行单元测试。 // MockMvc是Spring MVC中的一个测试工具,它可以模拟HTTP请求并对返回结果进行断言和验证。 // 使用standaloneSetup方法,可以将需要测试的控制器添加到MockMvc中进行测试,而不需要启动完整的Web应用程序。 // 这种单元测试的方式可以快速验证控制器的行为和返回结果,提高测试效率。 this.mvc = MockMvcBuilders.standaloneSetup(new IndexController()).build(); } //这是一个使用RestAssured库创建HTTP请求的示例代码。它将创建一个GET请求,请求的路径是“/index”。这个请求可以被发送到一个Web服务器,以获取位于“/index”路径的资源。 /** * 这段代码是一个 Java Spring 框架中的单元测试,用于测试一个控制器(Controller)的一个方法。具体解释如下: * <p> * mvc 是一个 MockMvc 类的实例化对象,用于模拟 HTTP 请求和响应。 * perform(request) 方法执行了一个 HTTP 请求,并返回一个 ResultActions 对象,用于执行后续的断言。 * andExpect(status().isOk()) 方法是一个 ResultActions 对象的方法,用于断言 HTTP 响应的状态码是否为 200(即 OK)。 * andExpect(content().string("hello world")) 方法也是一个 ResultActions 对象的方法,用于断言 HTTP 响应的内容是否为 "hello world"。 * 综上,这段代码的作用是测试一个控制器方法,检查该方法返回的 HTTP 响应是否为状态码为 200,内容为 "hello world"。 * * @throws Exception */ @Test public void contextLoads() throws Exception { RequestBuilder request = get("/index"); mvc.perform(request).andExpect(status().isOk()).andExpect(content().string("hello world")); request = get("/index/get").param("name", "无境"); mvc.perform(request).andExpect(status().isOk()).andExpect(content().string("{\"name\":\"无境\",\"title\":\"hello world\"}")); String le="aabb"; RequestBuilder request1 = get("/index/get/1/age"); mvc.perform(request1).andExpect(status().isOk()).andExpect(content().string("{\"id\":1,\"name\":\"age\",\"date\":\"aabb\"}")); } }
pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.roncoo.education</groupId> <artifactId>spring-boot-demo-02-1</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-boot-demo-02-1</name> <description>RESTfull API简单项目的快速搭建</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
偶尔学习中遇到的;现在有了postman等工具不一定能用到把;有i兴趣的可以学习下;