一、以往controller层的单元测试(只能使用浏览器测试)
弊端:
1.对于所有请求,无论是否成功,都返回200的状态码。
2.无法测试post、put、delete请求,只能测试get请求。
二、使用MockMvc进行单元测试
好处:
1.对于不同请求类型返回不同状态码
2.可以测试Restful的各种请求(get、post、put、delete等)
用法:
1.引入依赖
<!-- spring测试框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
2.建立测试类
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.fileUpload;
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.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
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.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setup(){
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
@Test
public void whenQuerySeccess() throws Exception{
mockMvc.perform(
get("/user")
.param("username","mike")
.param("age","18")
.param("ageTo","60")
.param("xxx","yyy")
//1.发送get请求,并带请求参数
.contentType(MediaType.APPLICATION_JSON_UTF8) //2.编码格式为json的utf8
).andExpect(status().isOk()) //3.判断返回的状态码是否为200 OK
.andExpect(jsonPath("$.length()").value(3)) //4.判断返回的json长度是否为3
.andReturn().getResponse().getContentAsString();
}
}