问题描述
我有以下测试课程:
@ActiveProfiles({ "DataTC", "test" })
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {BaseTestConfiguration.class, DataTestConfiguration.class, JpaConfiguration.class, PropertyPlaceholderConfiguration.class })
public class RegularDayToTimeSlotsTest {
...
问题似乎来自BaseTestConfiguration类:
The issue seems to come from the BaseTestConfiguration class:
@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 {
}
我系统地得到了这个例外:
I systematically get this exception:
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并得到上述异常...
I am not sure how to get around this issue. Somehow Spring is looking for a ServletContext when I run the test and I get the above exception...
推荐答案
您的@Configuration
类之一显然带有@EnableWebMvc
注释.这就是DelegatingWebMvcConfiguration
最终在您的堆栈跟踪中的方式,因为它是@EnableWebMvc
导入的 .
One of your @Configuration
classes is obviously annotated with @EnableWebMvc
. That's how DelegatingWebMvcConfiguration
ends up in your stack trace, since it is imported by @EnableWebMvc
.
因此,尽管您认为,您并不需要WebApplicationContext
(因此也不需要ServletContext
),但实际上确实需要它是因为您正在使用@EnableWebMvc
加载应用程序上下文
So although you think you don't need a WebApplicationContext
(and hence a ServletContext
), you in fact do need it simply because you are loading an application context with @EnableWebMvc
.
您有两个选择:
- 编写用于集成测试的配置类,以便不包括与Web相关的配置(即,用
@EnableWebMvc
注释的@Configuration
类). - 按照上面其他注释中的建议,用
@WebAppConfiguration
注释测试类.
- Compose the configuration classes for your integration test so that you are not including the web-related configuration (i.e., the
@Configuration
class(es) annotated with@EnableWebMvc
). - Annotate your test class with
@WebAppConfiguration
as suggested in other comments above.
此致
Sam(Spring TestContext Framework的作者)
Sam (author of the Spring TestContext Framework)
这篇关于java.lang.IllegalArgumentException:需要ServletContext来配置默认的Servlet处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!