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

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

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

Кажется, проблема связана с классом 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.<init>(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(<generated>)
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerByCGLIB$$bb4ceb44$$FastClassByCGLIB$$368bb5c1.invoke(<generated>)
    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(<generated>)
    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, когда я запускаю тест и получаю указанное выше исключение...

4 ответа

Решение

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

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

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

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

С Уважением,

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

Кажется, ты пропал

@WebAppConfiguration

из вашего тестового класса.

Документация гласит

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

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

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

@WebAppConfiguration

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

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

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

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

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

Другие вопросы по тегам