传参问题
GET[select]:
1.路径参数 : @PathVariable
2.表单参数 : @RequestParam
POST[insert]: 1.JSON请求体参数 : @RequestBody
PUT[update]: 1.路径参数 : @PathVariable 2.表单参数 : @RequestParam
DELETE[delete]: 1.路径参数 : @PathVariable 2.表单参数 : @RequestParam
MockMvc: 1.路径请求 mockMvc.perform(MockMvcRequestBuilders
.请求方式(“url / {path}”,参数值)
示例:
//执行请求(使用GET请求)
MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders
.get("/vnone/{userId}","123") //路径传参.
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(MockMvcResultHandlers.print()) // MockMvcResultHandlers.print() 日志打印会更清晰
.andReturn();
2.表单请求 mockMvc.perform(MockMvcRequestBuilders .请求方式(“url”).param(“键”,“值”).contentType(MediaType.APPLICATION_FORM_URLENCODED)
示例:
//执行请求(使用GET请求)
MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders
.get("/vnone")
.param("mailNo", "SF12345678") //路径传参.
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(MockMvcResultHandlers.print()) // MockMvcResultHandlers.print() 日志打印会更清晰
.andReturn();
3.JSON请求
示例:
String requestBody = "{\"id\":1, \"name\":\"zhang\"}"; MvcResult mvcResult = mockMvc.perform(post("/user") .contentType(MediaType.APPLICATION_JSON).content(requestBody) .accept(MediaType.APPLICATION_JSON)) //执行请求 .andExpect(jsonPath("$.id").value(1)); //使用Json path验证JSON 请参考http://goessner.net/articles/JsonPath/
异步测试: //Callable MvcResult result = mockMvc.perform(get("/user/async1?id=1&name=zhang")) //执行请求 .andExpect(request().asyncStarted()) .andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class))) //默认会等10秒超时 .andReturn(); mockMvc.perform(asyncDispatch(result)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.id").value(1));
文件上传: byte[] bytes = new byte[] {1, 2}; mockMvc.perform(fileUpload("/user/{id}/icon", 1L).file("icon", bytes)) //执行文件上传 .andExpect(model().attribute("icon", bytes)) //验证属性相等性 .andExpect(view().name("success")); //验证视图
验证请求参数绑定到模型数据及Flash属性: mockMvc.perform(post("/user").param("name", "zhang")) //执行传递参数的POST请求(也可以post("/user?name=zhang")) .andExpect(handler().handlerType(UserController.class)) //验证执行的控制器类型 .andExpect(handler().methodName("create")) //验证执行的控制器方法名 .andExpect(model().hasNoErrors()) //验证页面没有错误 .andExpect(flash().attributeExists("success")) //验证存在flash属性 .andExpect(view().name("redirect:/user")); //验证视图
测试类:
package com.vn.vnone; import com.vn.vnone.service.VnoneService; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.mock.web.MockServletContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import java.util.concurrent.atomic.AtomicInteger; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.in; 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; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = {VnoneApplication.class, MockServletContext.class}) @WebAppConfiguration @Slf4j class VnoneApplicationTests { /** * 引入 webApplicationContext 之后,才可以在测试类中使用 servcie 、dao层注入的对象 */ @Autowired private WebApplicationContext webApplicationContext; @Mock private VnoneService vnoneService; private MockMvc mvc; // Spring Boot 2.2.9 默认使用的是junit 5,在junit 5中 @Before 被 @BeforeEach代替。 @BeforeEach public void setUp() throws Exception { mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } @Test void getUser() throws Exception { // 测试VnoneController RequestBuilder request = null; // 1、get查一下user列表,应该为空 request = get("/vnone"); mvc.perform(request) .andExpect(status().isOk()) .andExpect(content().string(equalTo("vn/vnone"))) .andDo(MockMvcResultHandlers.print()); } @Test void createUser() throws Exception { //执行请求(使用POST请求) MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders .post("/vnone") .param("username", "vn") .param("age", "10") //若无参数则不写param. .accept(MediaType.APPLICATION_JSON_UTF8)) .andDo(MockMvcResultHandlers.print()) // MockMvcResultHandlers.print() 日志打印会更清晰 .andReturn(); //获取返回编码 int status = mvcResult.getResponse().getStatus(); //获取返回结果 String content = mvcResult.getResponse().getContentAsString(); //断言,判断返回编码是否正确 Assert.assertEquals(200, status); System.out.println("--------返回的json = " + content); } }