package compaskenapi.compaskenlearn.junit.test.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import compaskenapi.compaskenlearn.ComPaskenLearnApplicationTests;
import compaskenapi.compaskenlearn.junit.test.entity.User;
import compaskenapi.compaskenlearn.junit.test.param.UserRequestBodyParam;
import compaskenapi.compaskenlearn.junit.test.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import java.util.Date;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
/**
* 更详细请参考:https://blog.csdn.net/xiao_xuwen/article/details/52890730
* 整个测试过程非常有规律:
* 1、准备测试环境
* 2、通过MockMvc执行请求
* 3.1、添加验证断言
* 3.2、添加结果处理器
* 3.3、得到MvcResult进行自定义断言/进行下一步的异步请求
* 4、卸载测试环境
*
* @author pasken
* @date on 2019/5/26.
*/
@Slf4j
public class UserControllerTest extends ComPaskenLearnApplicationTests {
@Mock
private UserService userService;
@Test
public void testView() throws Exception {
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/user/1"))
.andExpect(view().name("user/view"))
.andExpect(model().attributeExists("user"))
.andDo(print())
.andReturn();
Assert.assertNotNull(result.getModelAndView().getModel().get("user"));
}
/**
* 测试 ModelAndView
*
* @throws Exception
*/
@Test
public void test() throws Exception {
//测试普通控制器
mockMvc.perform(get("/user/{id}", 1)) //执行请求
.andExpect(model().attributeExists("user")) //验证存储模型数据
.andExpect(view().name("user/view")) //验证viewName
.andExpect(forwardedUrl("/WEB-INF/jsp/user/view.jsp"))//验证视图渲染时forward到的jsp
.andExpect(status().isOk())//验证状态码
.andDo(print()); //输出MvcResult到控制台
}
/**
* 测试 PathVariable
*
* @throws Exception
*/
@Test
public void testPathVariable() throws Exception {
//测试普通控制器
MvcResult result = mockMvc.perform(
get("/user/testPathVariable/{id}", 1) //执行请求
.accept(MediaType.APPLICATION_JSON)
.param("name", "zhangsan")
.param("password", "123456")
)
.andExpect(status().isOk())//验证状态码
.andDo(print())//输出MvcResult到控制台
.andReturn();
// 获取方法的返回值
String responseContent = result.getResponse().getContentAsString();
log.info("testPathVariable result>>[{}]", responseContent);
}
/**
* 测试 RequestParam
*
* @throws Exception
*/
@Test
public void testRequestParam() throws Exception {
MvcResult result = mockMvc.perform(
get("/user/testRequestParam")
.accept(MediaType.APPLICATION_JSON)
.param("name", "zhangsan")
.param("password", "123456")
)
.andDo(print())
.andExpect(status().isOk())
.andReturn();
// 获取方法的返回值
String responseContent = result.getResponse().getContentAsString();
log.info("testRequestParam result>>[{}]", responseContent);
}
/**
* 测试 RequestBody
*
* @throws Exception
*/
@Test
public void testRequestBody() throws Exception {
UserRequestBodyParam userRequestBodyParam = UserRequestBodyParam.build("李四", "456789", 25);
String requestJson = getRequestJson(userRequestBodyParam);
MvcResult result = mockMvc.perform(
post("/user/testRequestBody")
//注意类型
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(requestJson)
)
.andDo(print())
.andExpect(status().isOk())
.andReturn();
// 获取方法的返回值
String responseContent = result.getResponse().getContentAsString();
log.info("testUserRequestBody result>>[{}]", responseContent);
}
/**
* @param param
* @return
* @throws JsonProcessingException
* @RequestBody请求对象的json
*/
private String getRequestJson(Object param) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter();
return ow.writeValueAsString(param);
}
@Before
public void buildUser() {
User mockUser = new User();
mockUser.setName("john");
mockUser.setId(1L);
mockUser.setCreateDate(new Date());
//使用when().thenReturn()方法指定测试接口中某方法的返回值
when(userService.findOne(1L)).thenReturn(mockUser);
}
@Test
public void findOneTest() {
User user = userService.findOne(1L);
log.info("user.name = {}", user.getName());
Assert.assertEquals(user.getName(), "john");
}
}
===============================================================
controller
===============================================================
package compaskenapi.compaskenlearn.junit.test.controller;
import compaskenapi.compaskenlearn.junit.test.entity.User;
import compaskenapi.compaskenlearn.junit.test.param.UserRequestBodyParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("/user")
@Slf4j
public class UserController {
@RequestMapping("/{id}")
public ModelAndView view(@PathVariable("id") Long id) {
User user = new User();
user.setId(id);
user.setName("zhang");
ModelAndView mv = new ModelAndView();
mv.addObject("user", user);
mv.setViewName("user/view");
return mv;
}
@GetMapping("/testPathVariable/{id}")
@ResponseBody
public Map<String, Object> testPathVariable(@PathVariable("id") Long id) {
Map<String, Object> data = new HashMap(3);
User user = new User();
user.setId(id);
user.setName("testPathVariable");
data.put("testPathVariable", "testPathVariable");
data.put("id", id);
data.put("user", user);
return data;
}
@RequestMapping("/testRequestParam")
@ResponseBody
public Map<String, Object> testRequestParam(@RequestParam String name, @RequestParam String password) {
Map<String, Object> data = new HashMap(3);
data.put("testRequestParam", "testRequestParam");
data.put("name", name);
data.put("password", password);
return data;
}
@PostMapping("/testRequestBody")
@ResponseBody
public Map<String, Object> testRequestBody(@RequestBody UserRequestBodyParam param) {
Map<String, Object> data = new HashMap(3);
data.put("testRequestBody", "testRequestBody");
data.put("UserRequestBodyParam", param);
return data;
}
}
===============================================================
User
===============================================================
package compaskenapi.compaskenlearn.junit.test.entity;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.util.Date;
/**
* @author pasken
* @date on 2019/5/26.
*/
@Slf4j
@Data
public class User implements Serializable {
private Long id;
private String name;
private Date createDate;
}
===============================================================
UserRequestBodyParam
===============================================================
package compaskenapi.compaskenlearn.junit.test.param;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
/**
* @author pasken
* @date on 2019/5/26.
*/
@Slf4j
@Data
@Accessors(chain = true)
@AllArgsConstructor(staticName = "build")
public class UserRequestBodyParam implements Serializable {
private String name;
private String password;
private int age;
}