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)