java.lang.IllegalArgumentException: ServletContext требуется для настройки обработки сервлета по умолчанию

У меня есть следующий тестовый class:

@ActiveProfiles({ "DataTC", "test" }) @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {BaseTestConfiguration.class, DataTestConfiguration.class, JpaConfiguration.class, PropertyPlaceholderConfiguration.class }) public class RegularDayToTimeSlotsTest { ... 

Проблема, похоже, исходит из classа BaseTestConfiguration:

 @Configuration @ComponentScan(basePackages = { "com.bignibou" }, excludeFilters = { @Filter(type = FilterType.CUSTOM, value = RooRegexFilter.class), @Filter(type = FilterType.ANNOTATION, value = Controller.class), @Filter(type = FilterType.ANNOTATION, value = ControllerAdvice.class) }) public class BaseTestConfiguration { } 

Я систематически получаю это исключение:

 Caused by: java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling at org.springframework.util.Assert.notNull(Assert.java:112) at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.(DefaultServletHandlerConfigurer.java:54) at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.java:329) at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44.CGLIB$defaultServletHandlerMapping$22() at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44$$FastClassByCGLIB$$368bb5c1.invoke() at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:326) at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44.defaultServletHandlerMapping() at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166) ... 43 more 

Я не уверен, как обойти эту проблему. Почему-то Spring ищет ServletContext, когда я запускаю тест, и получаю исключение выше …

Один из ваших classов @Configuration очевидно, аннотируется с помощью @EnableWebMvc . Вот как DelegatingWebMvcConfiguration попадает в вашу трассировку стека, поскольку она импортируется @EnableWebMvc .

Поэтому, хотя вы считаете, что вам не нужен WebApplicationContext (и, следовательно, ServletContext ), на самом деле вам это нужно просто потому, что вы загружаете контекст приложения с помощью @EnableWebMvc .

У вас есть два варианта:

  • Составьте classы конфигурации для вашего теста интеграции, чтобы вы не включали связанную с сетью конфигурацию (то @Configuration class @Configuration аннотированный с помощью @EnableWebMvc ).
  • Аннотировать свой тестовый class с помощью @WebAppConfiguration как это предлагается в других комментариях выше.

С Уважением,

Сэм (автор Spring TestContext Framework)

Кажется, что вам не хватает

 @WebAppConfiguration 

из вашего тестового classа.

В документации указано

Базовый путь ресурса используется за кулисами для создания MockServletContext, который служит в качестве ServletContext для WebApplicationContext теста.

Обычно контейнер Servlet предоставляет ServletContext . Поскольку вы находитесь в тестовой среде, вам нужна подделка. @WebAppConfiguration обеспечивает это.

Чтобы создать экземпляр контекста сервлета, вам нужно будет использовать аннотацию.

 @WebAppConfiguration 

Аннотирование на уровне classа, используемое для объявления того, что ApplicationContext, загруженный для теста интеграции, должен быть WebApplicationContext. Простое присутствие @WebAppConfiguration в тестовом classе гарантирует загрузку WebApplicationContext для теста с использованием значения по умолчанию «file: src / main / webapp» для пути к корню веб-приложения (т. Е. Ресурса базовый путь). Базовый путь ресурса используется за кулисами для создания MockServletContext, который служит в качестве ServletContext для WebApplicationContext теста.

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

Оказывается, если вы используете пользовательский PermissionEvaluator тогда вам нужно объявить его в отдельном classе @Configuration который находится в вашей основной конфигурации безопасности Spring.

См.: Как добавить защиту на основе метода к проекту Spring Boot?

Существует также открытая проблема Github: https://github.com/spring-projects/spring-boot/issues/4875

Давайте будем гением компьютера.