test mvc example spring spring-mvc spring-test

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 ...



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)