-
模拟restapi调用,用来测试接口,也可用来进行自动化测试。
@Autowired
private WebApplicationContext wac;private MockMvc mockMvc;
@Before
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}之后可以通过使用mokMvc进行接口的调用测试:
例如:
@Test
public void whenQuery() throws Exception {
String result = mockMvc.perform(MockMvcRequestBuilders.get("/user") //用get方式调用接口/user
.contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(MockMvcResultMatchers.status().isOk()) //期望返回的状态码,如果与期望不一致,junit会执行失败
.andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3)) //期望返回的集合中数据数量是3个
.andReturn().getResponse().getContentAsString(); //获取返回结果的字符
System.out.println(result);
}
另外,因为使用这种方式模拟调用接口,会经常使用MockMvcRequestBuilders和MockMvcResultMatchers,所以可以按如下方式简化操作:
在属性配置中:java->editor->Content Assist->Favorites中添加偏好内容:MockMvcRequestBuilders和MockMvcResultMatchers)
这样配置之后,可以按以下方式进行调用:
@Test
public void whenQuery1() throws Exception {
String result = mockMvc.perform(get("/user")
/*带上参数,配置为分页查看
@PageableDefault(page = 2, size = 17, sort = "username,asc") Pageable pageable进行分页
*/
.param("size", "15")
.param("page", "3")
.param("sort", "age,desc")
.contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(status().isOk()) //期望返回的状态码
.andExpect(jsonPath("$.length()").value(3)) //期望返回的集合中数据数量是3个
.andReturn().getResponse().getContentAsString(); //获取返回结果的字符
System.out.println(result);
}
--------------------------------------------------------------------------------------------
@GetMapping("/user")
@JsonView(User.userSimpleView.class) //配置返回的视图
public List<User> query(@PageableDefault(page = 2, size = 17, sort = "username,asc") Pageable pageable){
System.out.println(pageable);
List<User> result = new ArrayList<>();
for (int i = 0; i < 3; i++) {
User u = new User();
u.setUserName("aaa" + i);
u.setPassword("123");
result.add(u);
}
return result;
}
还可以添加更多的测试代码:
@Test
public void whenGetInfo() throws Exception {
String result = mockMvc.perform(get("/user/1") //通过路径来传递参数
.contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(status().isOk())
.andExpect(jsonPath("$.userName").value("aaaWith1"))
.andReturn().getResponse().getContentAsString();
System.out.println(result);
}
//通过正则表达式验证参数 ,只能输入数字,否则报错
@Test
public void whenGetInfoByString() throws Exception {
//测试当传递的参数是非数字时,则返回错误信息
mockMvc.perform(get("/user/a")
.contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(status().is4xxClientError()); //因为参数不对所以报错,期望返回4XX错误,否则junit执行失败
}
-------------------------------------------------------------------------------------------
@GetMapping("/user/{id:\\d+}")
@JsonView(User.userDatailView.class) //返回的视图配置
public User userInfoById(@PathVariable String id){
User u = new User();
u.setUserName("aaaWith1" );
u.setPassword("1");
return u;
}
其中视图配置为:
public class User {
public interface userSimpleView{};
public interface userDatailView extends userSimpleView{};
private String userName;
private String password;
@JsonView(userSimpleView.class)
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@JsonView(userDatailView.class)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}