Тест пружинного загрузочного модуля не работает при возврате жестко закодированных значений - PullRequest
0 голосов
/ 20 апреля 2019

У меня ниже сопоставления конечной точки REST.

@GetMapping("/employee/{id}")
public ResponseEntity<Employee> getEmployee(@PathVariable("id") int id) {
    Employee employee = employeeRepository.getEmployeeById (id);
    if(employee == null) {
        throw new EmployeeNotFoundException ();
    }
    ResponseEntity<Employee> responseEntity = new ResponseEntity<Employee> (employee, HttpStatus.OK);
    return responseEntity;
}

Чтобы проверить неверный путь, у меня есть следующий тестовый пример.

@Test
public void getEmployeeFailTest() throws Exception {
    Mockito.when (employeeRepository.getEmployeeById (Mockito.anyInt ())).thenReturn (null);
    RequestBuilder requestBuilder = MockMvcRequestBuilders.get ("/employee/10")
            .accept (MediaType.APPLICATION_JSON);
    MvcResult result = mockMvc.perform (requestBuilder).andReturn ();
    String response = result.getResponse ().getContentAsString ();
    System.out.println (employeeRepository.getEmployeeById (5)==null);
    String expected = "{\"errorCode\":1,\"message\":\"404: Employee not found!\"}";
    JSONAssert.assertEquals (expected, response, false);
    Assert.assertEquals (404, result.getResponse ().getStatus ());
}

В классе репозитория я возвращаю жестко закодированный объект Employee.

public Employee getEmployeeById(int i) {
    Employee employeeMock = new Employee (1, "XYZ","randomEmail@gmail.com",new Department (1, "HR"));
    return  employeeMock;
}

Тестовые примеры успешно проходят, когда я возвращаю null в вышеуказанном методе. Но с вышеприведенной реализацией это терпит неудачу.

Благодаря Mockito.when (employeeRepository.getEmployeeById (Mockito.anyInt ())).thenReturn (null); getEmployeeById возвращает null в тестовом методе, но в методе контроллера выше в жестко закодированном Employee объекте возвращается

Я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

1) Если я правильно понимаю ваш тест, вы ожидаете «404 not found» в ответ на «employee / 10». Когда вы возвращаете null, тогда контроллер REST выдает EmployeeNotFoundException (который, я предполагаю, обрабатывается с помощью обработчика исключений и преобразуется в 404). Когда вы возвращаете ненулевой объект, исключение не выдается, и тест не пройден.

Я предлагаю вашему классу репозитория эмулировать объект, не найденный

public Employee getEmployeeById(int i) {
  return i==10 ? null : new Employee (1, "XYZ","randomEmail@gmail.com",new Department (1, "HR"));
} 

2) Mockito.when (employeeRepository.getEmployeeById (Mockito.anyInt ())).thenReturn (null); этот код не работает. Я предполагаю, что вы не вводите employeeRepository в REST должным образом. Вы должны пометить его как @MockBean в вашем тестовом классе, чтобы Spring Test предпочел его над реальной реализацией

0 голосов
/ 20 апреля 2019

Ваш экземпляр employeeRepository в контроллере REST, вероятно, не совпадает с экземпляром, в котором вы пытаетесь заглушить возвращаемое значение в своем тесте.

Обычно для ложного экземпляра по умолчанию возвращается значение null для большинства ссылочных типов.Поскольку вы получаете жестко закодированный объект, похоже, что ваша конкретная реализация используется в контроллере REST.Предполагая, что ваш REST-контроллер получает employeeRepository посредством какого-либо внедрения зависимостей, вы должны убедиться, что ваш макет внедряется в него, либо путем явного внедрения этого кода, либо путем предоставления фиктивного компонента для Spring-контекста вашего теста.

...