Подтвердить что ты не робот

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, когда я запускаю тест, и получаю исключение выше...

4b9b3361

Ответ 1

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

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

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

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

Привет,

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

Ответ 2

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

@WebAppConfiguration

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

documentation утверждает

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

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

Ответ 3

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

@WebAppConfiguration

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

Ответ 4

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

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

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

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