Можно ли использовать ErrorController с @WebMvcTest? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть контроллер ошибок (для обработки пути "/ error"), который работает, когда приложение работает, но при модульном тесте с @WebMvcTest он не работает.

Также контроллер ошибокработает, если я отправляю запрос прямо на его путь.

Это мой контроллер ошибок:

@Controller
public class ErrorController implements org.springframework.boot.web.servlet.error.ErrorController {

    @RequestMapping("/error")
    public ResponseEntity<List<Error>> handleError(HttpServletRequest request) {

и это мой тестовый класс:

@RunWith(SpringRunner.class)
@WebMvcTest({ErrorController.class})
public class ErrorControllerTest {

    @Autowired
    private MockMvc mockMvc;

У меня естьтакже попытался добавить класс ErrorMvcAutoConfiguration в аннотации WebMvcTest.

Я отладил класс ErrorMvcAutoConfiguration и обнаружил, что при запуске приложения оно находит средство разрешения ошибок, но при запуске в качестве модульного теста оно не находит никаких.

Идея этого теста состоит в том, чтобы убедиться, что конфигурация Spring (которая является кодом), которая приводит к выполнению этого контроллера ошибок, является правильной.

1 Ответ

0 голосов
/ 21 декабря 2018

Вы не выполняете модульный тест , если ожидаете запуска ErrorController путем вызова метода в MyController.Это интеграционный тест, и вам не нужно его делать.

Если вы описываете свой тест следующим образом: «Я хочу видеть, что исключение из класса MyController попадает в класс ErrorController», тогда выне тестировать ни класс MyController, ни класс ErrorController;вместо этого вы проверяете, что Spring работает. Вам не нужно проверять, что Spring работает. Авторы Spring тестируют, чтобы увидеть, что Spring работает.

Если вы хотите проверить, что аннотация вErrorController является корректным, так что Spring определяет его как класс ErrorController как контроллер ошибок, и вы находитесь на правильном пути.Это все еще интеграционный тест , а не модульный тест.

Чтобы выполнить модульное тестирование класса ErrorController, просто создайте экземпляр класса ErrorController в модульном тесте и вызовите методы.Вы можете использовать отражение в модульном тесте, чтобы убедиться, что аннотации «кажутся вам правильными».Вот простой пример модульного теста ErrorController.

public TestErrorController
{
  private ErrorController classToTest;

  @Mock
  private HttpServletRequest mockHttpServletRequest;

  private
  @Before
  public void beforeTest()
  {
    MockitoAnnotations.initMocks(this);

    classToTest = new ErrorController();
  }

  @Test
  public void handleError_allGood_success()
  {
    private ResponseEntity<List<Error>> actualResult;

    // mock the desired mockHttpServletRequest functionality.
    doReturn(something).when(mockHttpServletRequest).someMethod();


    // Perform the test.
    actualResult = classToTest.handleError(mockHttpServletRequest);


    // Do asserts on the actualResult here.
  }
}
...