gpt4 book ai didi

java - JUnit POST @Test 返回空字符串

转载 作者:行者123 更新时间:2023-12-02 00:45:59 25 4
gpt4 key购买 nike

问题

我正在尝试为 Spring Controller 编写一个测试,但测试本身似乎没有返回任何内容。奇怪的是,如果我用 Postman 手动测试它,我会得到预期的结果。

期待

我的期望

{
"title": "My Third Todo"
}

postman
enter image description here

我得到了什么(空响应?) enter image description here

相关代码

TodoService

@Service
public class TodoService {

private TodoRepository todoRepository;

@Autowired
public TodoService(TodoRepository todoRepository) {
this.todoRepository = todoRepository;
}

public List<Todo> findAll() {
return todoRepository.findAll();
}

public Todo findById(Long todoId) {
return todoRepository.findById(todoId).orElse(null);
}

public Todo save(Todo todo) {
return todoRepository.save(todo);
}

public void deleteById(Long todoId) {
todoRepository.deleteById(todoId);
}

}

TodoController

@RestController
@RequestMapping("/api/todos")
public class TodoController {

private TodoService todoService;

@Autowired
public TodoController(TodoService todoService) {
this.todoService = todoService;
}

@PostMapping
public Todo save(@RequestBody Todo todo) {
return todoService.save(todo);
}

}

TodoControllerTest

@RunWith(SpringRunner.class)
@WebMvcTest(TodoController.class)
public class TodoControllerTest {

@Autowired
private MockMvc mockMvc;

@MockBean
private TodoService todoService;

private List<Todo> todos;

public TodoControllerTest() {
Todo firstTodo = new Todo();
firstTodo.setId(1L);
firstTodo.setTitle("My First Todo");

Todo secondTodo = new Todo();
secondTodo.setId(2L);
secondTodo.setTitle("My Second Todo");

todos = new ArrayList<>();
todos.add(firstTodo);
todos.add(secondTodo);
}

@Test
public void save() throws Exception {
Todo thirdTodo = new Todo();
thirdTodo.setId(3L);
thirdTodo.setTitle("My Third Todo");

when(todoService.save(thirdTodo)).thenReturn(thirdTodo);

String mock = mockMvc.perform(post("/api/todos")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"title\": \"My Third Todo\"}"))

.andExpect(status().isOk())

.andReturn()
.getResponse()
.getContentAsString();

System.out.println("\n\n\n");
System.out.println("Mock: " + mock);
System.out.println("\n\n\n");
}

}

最佳答案

看来,在 POST 请求中发送 JSON 时,您需要对 JSON 表示的对象进行 1:1 映射。在上面的 @Test 示例中,我没有这样做。

示例类

public class MyObject {
private Long id;
private String title;

// Constructor, getters, and setters
}

对于示例类 my MyObject,当您想将其传递给 RequestBuilder.post(...).content(...) 时,您显然需要像这样 1:1 映射

RequestBuilder.post(...)
content("{\"id\":1,\"title\":\"My Third Todo\"}\")

另一个建议是使用 ObjectMapper 将对象转换为 JSON。

Todo todo = new Todo(1L, "My Third Todo");
ObjectMapper mapper = new ObjectMapper();

String todoJson = mapper.writeValueAsString(todo);

mockMvc.perform(RequestBuilder.post("/api/todos")
.contentType(MediaType.APPLICATION_JSON)
.content(todoJson))
// do whatever else you need

关于java - JUnit POST @Test 返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57897408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com