Тесты Spring Controller проваливаются случайным образом - PullRequest
2 голосов
/ 04 июля 2019

Есть проект примерно с 20 контроллерами. Каждый контроллер имеет свой соответствующий класс испытаний. Когда мы пытаемся добавить новые классы тестов контроллера, некоторые из предыдущих тестов, которые работали нормально, начинают случайно проваливаться. Если какой-либо класс тестов контроллера помечен @Ignore, тесты возвращаются в нормальное состояние.

Это исключение, выдаваемое неудачными тестами:

org.springframework.web.util.NestedServletException: обработка запроса не удалась; Вложенное исключение - java.lang.IllegalStateException: org.springframework.web.context.support.GenericWebApplicationContext@22f3fadf уже закрыт.

Полный журнал одного неудачного теста:

:: Spring Boot :: (v2.0.3.RELEASE)

2019-07-04T13: 01: 50,325 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.b.StartupInfoLogger: запуск ZipCodeControllerTest для valhala с PID 17817 (запущено wblanck в / home / wblanck / Projects / project) 2019-07-04T13: 01: 50,325 DEBUG [pool-1-thread-17] o.s.b.StartupInfoLogger: Запуск с Spring Boot v2.0.3.RELEASE, Spring v5.0.7.RELEASE 2019-07-04T13: 01: 50,325 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.b.SpringApplication: активный профиль не установлен, откат к профили по умолчанию: по умолчанию 2019-07-04T13: 01: 50,326 INFO [pool-1-thread-17] o.s.c.s.AbstractApplicationContext: обновление org.springframework.web.context.support.GenericWebApplicationContext@a5a2b92: дата запуска [Чт, 04 июля, 13:01:50 ART 2019]; корень контекстной иерархии 2019-07-04T13: 01: 50,448 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.b.f.a.AutowiredAnnotationBeanPostProcessor: JSR-330 Обнаружена и поддерживается аннотация 'javax.inject.Inject' для автоматической проводки

2019-07-04T13: 01: 50,772 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.w.s.h.AbstractHandlerMethodMapping $ MappingRegistry: Mapped "{[/ error]}" на всеобщее обозрение org.springframework.http.ResponseEntity com.package.controller.WrongPathErrorController.badPathError (javax.servlet.http.HttpServletRequest) 2019-07-04T13: 01: 50,772 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.w.s.h.AbstractHandlerMethodMapping $ MappingRegistry: Mapped "{[/ API / пользователей / {устройство} / почтовый код], методы = [GET], производит = [приложения / JSON]}" на публику org.springframework.http.ResponseEntity com.package.controller.ZipCodeController.checkZipCode (java.lang.Integer, java.lang.String, java.lang.String, java.lang.Integer, java.lang.String)

... подробнее HandlerMethodMappings ...

2019-07-04T13: 01: 50,773 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.w.s.h.AbstractHandlerMethodMapping $ MappingRegistry: Mapped "{[/ swagger-resources / configuration / ui]}" на общедоступных org.springframework.http.ResponseEntity springfox.documentation.swagger.web.ApiResourceController.uiConfiguration () 2019-07-04T13: 01: 50,773 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.w.s.h.AbstractHandlerMethodMapping $ MappingRegistry: Mapped "{[/ swagger-resources]}" на всеобщее обозрение org.springframework.http.ResponseEntity> springfox.documentation.swagger.web.ApiResourceController.swaggerResources () 2019-07-04T13: 01: 50,773 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.w.s.h.AbstractHandlerMethodMapping $ MappingRegistry: Mapped "{[/ swagger-resources / configuration / security]}" на общедоступных org.springframework.http.ResponseEntity springfox.documentation.swagger.web.ApiResourceController.securityConfiguration () 2019-07-04T13: 01: 50,824 ИНФОРМАЦИЯ [pool-1-thread-17] s.d.s.w.PropertySourcedRequestMappingHandlerMapping: сопоставленный путь URL [/ v2 / api-docs] на метод [public org.springframework.http.ResponseEntity springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation (java.lang.String, javax.servlet.http.HttpServletRequest)] 2019-07-04T13: 01: 50,859 INFO [pool-1-thread-17] o.s.w.s.h.AbstractUrlHandlerMapping: сопоставленный путь URL [//favicon.ico] на обработчик типа [класс org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2019-07-04T13: 01: 50,913 ИНФОРМАЦИЯ [pool-1-thread-17]o.s.w.s.m.m.a.RequestMappingHandlerAdapter: Ищем @ControllerAdvice: org.springframework.web.context.support.GenericWebApplicationContext@a5a2b92: дата запуска [Чт, 04 июля, 13:01:50 ART 2019]; корень контекстной иерархии 2019-07-04T13: 01: 50,931 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.w.s.h.AbstractUrlHandlerMapping: сопоставленный путь URL [/ webjars / ] на обработчик типа [класс org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2019-07-04T13: 01: 50,931 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.w.s.h.AbstractUrlHandlerMapping: сопоставленный путь URL [/ **] на обработчик типа [класс org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2019-07-04T13: 01: 50,938 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver: обнаружено Методы @ExceptionHandler в интеграцииExceptionHandler 2019-07-04T13: 01: 50,981 INFO [pool-1-thread-17] o.s.m.w.MockServletContext: инициализация Spring FrameworkServlet '' 2019-07-04T13: 01: 50,981 INFO [pool-1-thread-17] o.s.w.s.FrameworkServlet: FrameworkServlet '': инициализация началась 2019-07-04T13: 01: 50,987 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.w.s.FrameworkServlet: FrameworkServlet '': инициализация завершено за 6 мс 2019-07-04T13: 01: 50,995 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.c.s.DefaultLifecycleProcessor $ LifecycleGroup: запуск бинов в фаза 2147483647 2019-07-04T13: 01: 50,995 ИНФОРМАЦИЯ [pool-1-thread-17] s.d.s.w.p.DocumentationPluginsBootstrapper: обновлен контекст 2019-07-04T13: 01: 50,995 INFO [pool-1-thread-17] s.d.s.w.p.DocumentationPluginsBootstrapper: найдено 1 пользовательских плагин (ы) для документации 2019-07-04T13: 01: 50,999 INFO [pool-1-thread-17] s.d.s.w.s.ApiListingReferenceScanner: сканирование для список ссылок API, 2019-07-04T13: 01: 51,109 INFO [pool-1-thread-17] o.s.b.StartupInfoLogger: запущен ZipCodeControllerTest за 0,813 секунды (JVM работает в течение 39,78) 2019-07-04T13: 01: 51,111 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.c.s.AbstractApplicationContext: Закрытие org.springframework.web.context.support.GenericWebApplicationContext@40554129: дата запуска [Чт, 04 июля, 13:01:42 ART 2019]; корень контекстной иерархии 2019-07-04T13: 01: 51,112 ИНФОРМАЦИЯ [pool-1-thread-17] o.s.c.s.DefaultLifecycleProcessor $ LifecycleGroup: остановка компонентов в фаза 2147483647 Выполнено тестов: 3, сбоев: 0, ошибок: 1, пропущено: 0, Прошло времени: 14.141 с <<< НЕУДАЧИ! - в com.package.controller.ZipCodeControllerTest testInexistentCheckZipCode (com.package.controller.ZipCodeControllerTest) Прошедшее время: 10,648 с <<< ОШИБКА! org.springframework.web.util.NestedServletException: запрос обработка не удалась; вложенное исключение java.lang.IllegalStateException: org.springframework.web.context.support.GenericWebApplicationContext@22f3fadf был закрыт уже в com.package.controller.ZipCodeControllerTest.testInexistentCheckZipCode (ZipCodeControllerTest.java:80) Вызвано: java.lang.IllegalStateException: org.springframework.web.context.support.GenericWebApplicationContext@22f3fadf был закрыт уже в com.package.controller.ZipCodeControllerTest.testInexistentCheckZipCode (ZipCodeControllerTest.java:80) </p>

Тесты очень похожи, в основном общая структура:


@RunWith(SpringRunner.class)
@WebMvcTest(Controller.class)
public class ControllerTest {

    private static final String URL_TEMPLATE = ".....";

    @Autowired
    private MockMvc mvc;

    @Autowired
    private ObjectMapper mapper;

    @MockBean
    private Service service;

    private CustomParams params;
    private CustomRequest request;

    @Before
    public void init() {
        // initialize params and request ...
    }

    @Test
    public void methodOk() throws Exception {
        when(service.method(refEq(params))).thenReturn(RESPONSE);

        mvc.perform(MockMvcRequestBuilders.post(URL_TEMPLATE)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(mapper.writeValueAsString(request)))
                .andExpect(status().isOk())
                .andExpect(jsonPath(STATUS_MESSAGE_PATH, is(MESSAGE_CODE_OK)))
                .andExpect(jsonPath(STATUS_CODE_PATH, is(STATUS_OK.getStatusCode()))));
    }


    @Test
    public void badRequest() throws Exception {
        mvc.perform(MockMvcRequestBuilders.post(URL_TEMPLATE))
                .andExpect(status().isBadRequest())
                .andExpect(jsonPath(ERROR_MESSAGE_PATH).isNotEmpty());
    }

Контроллеры имеют следующую структуру:

@RestController
public class Controller {

    private Service service;

    @PostMapping(value = "/api/some-url", produces = {"application/json"})
    public ResponseEntity<CustomResponse> method(
            @RequestHeader("someheaders") Integer someHeaders,
            @RequestBody CustomRequest someBody) {

        CustomParams params = new CustomParams();
        params.setApplicationType(applicationType);
        params.someHeaders(someHeaders);

        return service.method(params);
    }


Я не могу понять причину исключений и тот факт, что они возникают в разных тестах при каждом запуске.

Я изменил классы и имена переменных из-за конфиденциальности.

1 Ответ

0 голосов
/ 04 июля 2019

Вы должны использовать аннотацию DirtiesContext в своих тестах.Это гарантирует, что вы получите чистый контекст в каждом тесте, и они не будут мешать друг другу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...