Ответ MockMVC JsonPath имеет пустое тело?

Тестирование контроллера дает следующую ошибку: 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);
    }

person JosV    schedule 05.12.2020    source источник


Ответы (1)


Проблема здесь:

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

Внутри Mockito использует метод equals () класса Object для сравнения объекта, который был передан методу в качестве аргумента с настроенным объектом. Если equals () не переопределен, то используется equals () java.lang.Object, который сравнивает только ссылки, т.е. если обе переменные указывают на один и тот же объект в куче. В текущем примере класс Employe (вероятно) не имеет реализованного метода equals (). При предоставлении ожидаемого создания нового объекта ссылки не являются одними и теми же, поэтому Mockito не пройдет проверку.

Поскольку объект сотрудника сериализуется из json, это не тот же объект.

Вы можете исправить это, используя Mockito.any() или Mockito.any(Employee.class).

person Tom    schedule 06.12.2020