spring - mvc - java.lang.IllegalArgumentException: se requiere un ServletContext para configurar el manejo de servlets predeterminado
spring test example (4)
Tengo la siguiente clase de prueba:
@ActiveProfiles({ "DataTC", "test" })
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {BaseTestConfiguration.class, DataTestConfiguration.class, JpaConfiguration.class, PropertyPlaceholderConfiguration.class })
public class RegularDayToTimeSlotsTest {
...
El problema parece provenir de la clase 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 {
}
Sistemáticamente obtengo esta excepción:
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
No estoy seguro de cómo solucionar este problema. De alguna manera, Spring está buscando un ServletContext cuando ejecuto la prueba y obtengo la excepción anterior ...
Obtuve un error similar pero al ejecutar la aplicación normalmente en lugar de intentar ejecutar pruebas.
Resulta que si utiliza un PermissionEvaluator
personalizado, debe declararlo en una clase @Configuration
diferente a la que tiene su configuración principal de seguridad Spring.
Ver: ¿Cómo agrego seguridad basada en método a un proyecto Spring Boot?
También hay un problema abierto de Github: https://github.com/spring-projects/spring-boot/issues/4875
Para que pueda crear una instancia del contexto del servlet, tendrá que usar la anotación.
@WebAppConfiguration
Una anotación de nivel de clase que se usa para declarar que ApplicationContext cargado para una prueba de integración debe ser un WebApplicationContext. La mera presencia de @WebAppConfiguration en una clase de prueba asegura que se cargará un WebApplicationContext para la prueba, utilizando el valor predeterminado de "file: src / main / webapp" para la ruta a la raíz de la aplicación web (es decir, el recurso ruta base). La ruta de la base de recursos se utiliza detrás de las escenas para crear un MockServletContext que sirve como el ServletContext para el WebApplicationContext de la prueba.
Parece que te estás perdiendo
@WebAppConfiguration
de tu clase de prueba.
La documentation indica
La ruta de la base de recursos se utiliza detrás de las escenas para crear un MockServletContext que sirve como el ServletContext para el WebApplicationContext de la prueba.
Normalmente, un contenedor Servlet proporcionaría el ServletContext
. Dado que estás en un entorno de prueba, necesitas un falso. @WebAppConfiguration
proporciona eso.
Una de sus clases @Configuration
obviamente está anotada con @EnableWebMvc
. Así es como DelegatingWebMvcConfiguration
termina en su rastro de pila, ya que es importado por @EnableWebMvc
.
Entonces, aunque cree que no necesita un WebApplicationContext
(y, por lo tanto, un ServletContext
), de hecho lo necesita simplemente porque está cargando un contexto de aplicación con @EnableWebMvc
.
Tienes dos opciones:
- Componga las clases de configuración para su prueba de integración para que no incluya la configuración relacionada con la web (es decir, las clases
@Configuration
anotadas con@EnableWebMvc
). - Anote su clase de prueba con
@WebAppConfiguration
como se sugiere en otros comentarios anteriores.
Saludos,
Sam (autor del Spring TestContext Framework)