Есть проект примерно с 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);
}
Я не могу понять причину исключений и тот факт, что они возникают в разных тестах при каждом запуске.
Я изменил классы и имена переменных из-за конфиденциальности.