Spring boot : RestTemplate POST 调用未 return 创建状态代码
Spring boot : RestTemplate POST call does not return created status code
我是 spring 启动休息模板的新手。我正在尝试为其余模板 post 调用编写单元测试用例。
我创建了一个用户控制器来发送虚拟数据。
为 POST 调用编写的 Usercontroller 是否适合单元测试?如果不是,正确的写法是什么?我从 usercontroller returning 得到的响应是否正确?我应该 return 状态代码为 200 还是 201?
有人可以帮助我吗?
下面是用户控制器
@PostMapping("/users")
public User createUser(@RequestBody User user){
List<String> messages = new ArrayList<>();
messages.add("Hi");
User createUser = new User();
createUser.setId(1);
createUser.setName("John");
createUser.setAge(22);
createUser.setMessages(messages);
return user;
}
下面是 post 调用的单元测试用例:
@Test
public void testSuccessPostUser() throws Exception{
String baseUrl = "http://localhost:8080/users";
List<String> messages = new ArrayList<>();
messages.add("Hi");
User user = new User();
user.setId(1);
user.setName("John");
user.setAge(22);
user.setMessages(messages);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
HttpEntity<User> httpEntity = new HttpEntity<>(user, httpHeaders);
HttpHandler httpHandler = new HttpHandler();
ResponseEntity<User> actual = httpHandler.sendPost(baseUrl, httpHeaders, user, User.class);
//verify request succeed
assertEquals(HttpStatus.CREATED, actual.getStatusCode());
assertEquals(201, actual.getStatusCodeValue());
assertTrue(responseBody.contains(id);
}
POST return默认为 200。
如果你想做到 return 201 添加:
@ResponseStatus(HttpStatus.CREATED)
@PostMapping("/users")
public User createUser(@RequestBody User user){
如果你想return自定义状态代码,你应该return RepsponseEntity
:
@PostMapping("/users")
public ResposneEntity<User> createUser(@RequestBody User user){
...
return new ResponseEntity(user, HttpStatus.CREATED);
}
如果您想了解 POST 方法的正确 https 状态,我建议您阅读:
首先,为了测试HTTP控制器你可以使用MockMvc
。
实例测试:
mockMvc.perform(post("/users")
.contentType(MediaType.APPLICATION_JSON)
.content("{ "id": 1, "Name": "John", "Age": 22 }")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isCreated())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$.id").value($id))
.andExpect(jsonPath("$.value").value("some-value"));
更多详情见docs
对于return 201代码,您需要在您的控制器中添加@ResponseStatus(HttpStatus.CREATED)
。
我是 spring 启动休息模板的新手。我正在尝试为其余模板 post 调用编写单元测试用例。 我创建了一个用户控制器来发送虚拟数据。 为 POST 调用编写的 Usercontroller 是否适合单元测试?如果不是,正确的写法是什么?我从 usercontroller returning 得到的响应是否正确?我应该 return 状态代码为 200 还是 201? 有人可以帮助我吗?
下面是用户控制器
@PostMapping("/users")
public User createUser(@RequestBody User user){
List<String> messages = new ArrayList<>();
messages.add("Hi");
User createUser = new User();
createUser.setId(1);
createUser.setName("John");
createUser.setAge(22);
createUser.setMessages(messages);
return user;
}
下面是 post 调用的单元测试用例:
@Test
public void testSuccessPostUser() throws Exception{
String baseUrl = "http://localhost:8080/users";
List<String> messages = new ArrayList<>();
messages.add("Hi");
User user = new User();
user.setId(1);
user.setName("John");
user.setAge(22);
user.setMessages(messages);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
HttpEntity<User> httpEntity = new HttpEntity<>(user, httpHeaders);
HttpHandler httpHandler = new HttpHandler();
ResponseEntity<User> actual = httpHandler.sendPost(baseUrl, httpHeaders, user, User.class);
//verify request succeed
assertEquals(HttpStatus.CREATED, actual.getStatusCode());
assertEquals(201, actual.getStatusCodeValue());
assertTrue(responseBody.contains(id);
}
POST return默认为 200。
如果你想做到 return 201 添加:
@ResponseStatus(HttpStatus.CREATED)
@PostMapping("/users")
public User createUser(@RequestBody User user){
如果你想return自定义状态代码,你应该return RepsponseEntity
:
@PostMapping("/users")
public ResposneEntity<User> createUser(@RequestBody User user){
...
return new ResponseEntity(user, HttpStatus.CREATED);
}
如果您想了解 POST 方法的正确 https 状态,我建议您阅读:
首先,为了测试HTTP控制器你可以使用MockMvc
。
实例测试:
mockMvc.perform(post("/users")
.contentType(MediaType.APPLICATION_JSON)
.content("{ "id": 1, "Name": "John", "Age": 22 }")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isCreated())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$.id").value($id))
.andExpect(jsonPath("$.value").value("some-value"));
更多详情见docs
对于return 201代码,您需要在您的控制器中添加@ResponseStatus(HttpStatus.CREATED)
。