【问题标题】:MockMVC JsonPath response has empty body?MockMVC JsonPath 响应有空的正文?
【发布时间】:2020-12-05 13:30:39
【问题描述】:

测试控制器会出现以下错误:java.lang.AssertionError: JSON 路径“$.firstName”处没有值。显然,出于某种原因,我的回复正文是空的。控制器是一个 RestController 并且我正确地模拟了该服务。有人可以帮我吗?

测试类:

@WebMvcTest(EmployeeController.class)
class EmployeeControllerTest {
    Employee employee = new Employee();

    @Autowired
    private MockMvc mvc;

    @MockBean
    private EmployeeServiceImpl service;


    @BeforeEach
    public void initEmployee() {
        employee.setFirstName("John");
        employee.setLastName("Doe");
        employee.setPlace("xxxx");
        employee.setEmployeeTitle(EmployeeTitle.SENIOR_JAVA_DEVELOPER);
        employee.setEmployeeId(1L);

    }

    @Test
    public void createEmployeeAPI() throws Exception {

        when(service.addNewEmployee(employee)).thenReturn(employee);

        mvc.perform(MockMvcRequestBuilders
                .post("/employees")
                .content(asJsonString(employee))
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON))
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.firstName").value("John"));

    }

请求是正确的,但响应的主体显然是空的(请参阅下面的控制台输出):

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /employees
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Accept:"application/json", Content-Length:"124"]
             Body = {"employeeId":1,"firstName":"John","lastName":"Doe","employeeTitle":"SENIOR_JAVA_DEVELOPER","place":"xxxx","photoURrl":null}
    Session Attrs = {}

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Vary:"Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers"]
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

控制器代码:

@RestController
@RequestMapping("/employees")
public class EmployeeController extends ExceptionHandling {
    private final EmployeeService employeeService;

    @Autowired
    public EmployeeController(EmployeeService employeeService) {
        this.employeeService = employeeService;
    }

    @PostMapping()
    public Employee addEmployee(@RequestBody Employee employee) {
        return employeeService.addNewEmployee(employee);
    }

【问题讨论】:

    标签: java testing mockito jsonpath mockmvc


    【解决方案1】:

    问题出在这里:

    when(service.addNewEmployee(employee)).thenReturn(employee);
    

    Mockito 在内部使用 Object 类的 equals() 方法来比较已作为参数传递给该方法的对象与配置的对象。如果 equals() 未被覆盖,则使用 java.lang.Object 的 equals() 仅比较引用,即如果两个变量都指向堆中的同一个对象。在当前示例中,Employe 类(可能)没有实现 equals() 方法。当提供预期的新对象被创建时,引用不是一个且相同的,因此 Mockito 将无法验证。

    因为员工对象是从json序列化而来的,所以不是同一个对象。

    您可以使用Mockito.any()Mockito.any(Employee.class) 解决此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-18
      • 2015-08-09
      • 2018-07-10
      • 1970-01-01
      • 2016-02-16
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多