单元测试第五篇,演示在单元测试时,如何模拟浏览器访问Controller里的方法,进行测试和验证。
相关代码已经放在Github上:源代码
下面简述开发过程:
1、首先,还是正常建立项目,并有常规的MongoDB操作的业务逻辑;
2、项目添加spring-boot-starter-test库的引用,打开pom.xml,添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
注1:scope为test,是仅在单元测试时引入,运行时并不引入。
3、application.yml配置文件无需修改.
4、在单元测试代码里,创建MockMvc对象,后续的单元测试,都要用它执行:
@Autowired
private WebApplicationContext webApplicationContext;
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
5、http的get请求方法测试举例:
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
// 构建一个请求
RequestBuilder builder = MockMvcRequestBuilders
.get("/hello?query2=xxxx") // 要请求的url路径
.header("x-merchant-id", "12345") // 添加请求header
.cookie(new Cookie("", "")) // 添加cookie,注意:不能用header方法加cookie
.param("query1", "abcd"); // 添加请求参数,注意:直接注入方法,而不是放在QueryString里
// 发起请求
ResultActions result = mockMvc.perform(builder);
// 避免后面的print里,输出乱码
result.andReturn().getResponse().setCharacterEncoding("UTF-8");
// 对响应结果进行断言
MvcResult mvcResult = result.andExpect(MockMvcResultMatchers.status().isOk()) // 断言:响应status必须是200
.andExpect(MockMvcResultMatchers.content().string("Hello,abcd12345")) // 断言:响应内容必须完全匹配
.andDo(MockMvcResultHandlers.print()) // 对结果进行输出
.andReturn();
// 获取完整响应内容
String response = mvcResult.getResponse().getContentAsString();
// 上面断言去掉,在这里用 response 进行断言也可以
6、http的post请求方法测试举例:
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
// 构建一个请求,包括url、header、参数
RequestBuilder builder = MockMvcRequestBuilders
.post("/hello")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"name\":\"张三\",\"desc\":\"哈哈\",\"sex\":15}")
.header("x-merchant-id", "12345")
.param("query1", "abcd");
// 发起请求
ResultActions result = mockMvc.perform(builder);
// 避免后面的print里,输出乱码
result.andReturn().getResponse().setCharacterEncoding("UTF-8");
// 断言
result.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON))
// 对输出的json里,desc的值进行断言
.andExpect(MockMvcResultMatchers.jsonPath("$.desc").value("哈哈-12345"))
.andDo(MockMvcResultHandlers.print()); // 对结果进行输出
如果你在运行时有问题,可以下载上面的源码,进行对比,看看你的代码哪里有问题。