当前位置: 首页 > 知识库问答 >
问题:

为什么Spring3.1WebMVCConfig的单元测试失败?

翟柏
2023-03-14

从Spring 3.1开始,由于@Enable*注释,我们可以更容易地使用JavaConfig。

所以我做了一个WebConfig来设置WebMvc配置,并尝试对其进行测试。但是,如果我使用WebConfig扩展WebMVCConfigureAdapter或WebMvcConfigurationSupport,单元测试将失败,因为缺少ServletContext。代码和消息如下所示。

网络配置。JAVA

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurationSupport {}

测验JAVA

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=WebConfig.class)
public class TestFail {
    @Test
    public void test() {}
}

留言

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
...
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:253)
    at com.zum.news.comments.web.WebConfig$$EnhancerByCGLIB$$8bbfcca1.CGLIB$defaultServletHandlerMapping$10(<generated>)
    at com.zum.news.comments.web.WebConfig$$EnhancerByCGLIB$$8bbfcca1$$FastClassByCGLIB$$19b86ad0.invoke(<generated>)
    at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:215)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:280)
    at com.zum.news.comments.web.WebConfig$$EnhancerByCGLIB$$8bbfcca1.defaultServletHandlerMapping(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:149)
    ... 41 more

如何正确地对WebConfig进行单元测试?

编辑

正如Garcia所说,这个bug在Spring3.2.0中已经修复。RC1。

只需在测试类中添加@WebAppConfiguration注释。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes=WebConfig.class)
public class TestFail {
    @Test
    public void test() {}
}

共有3个答案

田翔
2023-03-14

Spring 3.1中有一个bug,您可以在以下两个问题中找到答案:

  • https://jira.springsource.org/browse/SPR-5243
  • https://jira.springsource.org/browse/SPR-9799

如果您找到Spring3.1的解决方案,请告诉我们,如果没有,我们必须等到3.2出现。我必须说,我刚刚用Spring3.2.0进行了尝试。M2,但它仍然不适用于我。

龙俊美
2023-03-14

如果@EnableWebMvc注释需要ServletContext,那么我建议将您的配置拆分为bean定义,这些定义将用于单元测试以及应用程序和框架使用的其他配置。在这种情况下,应用程序将同时导入配置,而单元测试将只导入一个配置。

BeansConfig。java

@Configuration
public class BeansConfig {
    @Bean
    MyBean myBean() {
        return new MyBean()
    }
}

WebConfig。java

@Configuration
@EnableWebMvc
@Import(BeansConfig.class)
public class WebConfig extends WebMvcConfigurationSupport {}

TestFail。java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=BeansConfig.class)
public class TestFail {
    @Test
    public void test() {}
}
鄂慈
2023-03-14

正如Guido之前提到的,从3.2开始就解决了这个问题。以下是如何利用新的测试改进的详细信息。为确保为测试加载servlet上下文,您需要使用@WebAppConfiguration注释测试,并将注释ConfigWebContextLoader定义为上下文加载器,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)    
@WebAppConfiguration
@ContextConfiguration(
    classes = MyWebConfig.class, 
    loader = AnnotationConfigWebContextLoader.class)
public class MyTest {
    //...
}
 类似资料:
  • 我正在使用Angular2 final(2.0.2)和angular cli。我正在尝试将其设置为使用PhantomJS运行单元测试。使用Chrome和karma Chrome launcher运行规范-所有测试都通过。在Phantomjs预构建2.1中运行相同的功能。13和karma phantomjs launcher 1.0。2次测试失败。 我添加了phantomjs启动器到插件数组中kar

  • 我的问题是:我是否应该修复我的单元测试,因为他们没有找到错误?单元测试不应该考虑其他类吗?我只是修改了我的生产性代码,因为集成测试覆盖这些内容就足够了。 编辑: 由于这些答复,似乎有必要进一步说明我的问题。我仍然不确定哪个测试负责什么。 好吧,我的测试有100%的代码复盖率,我创造的突变体被我的测试检测到,所以一切看起来都很好。 我的第二个类是一个处理程序,它负责在每次调用handler.next

  • 问题内容: 第3、16、17、18和19行用*突出显示的含义是什么。有人可以解释他们的工作吗?我是python和编程新手 问题答案: 这段代码中只有三行用*突出显示,但这是它们的意思: 第一行: 这是在声明 后面 的函数( test_Iframe 和 tearDown )的 类* 。在面向对象的编程中,使用一个类来创建“对象” 。可以将 类 视为数据/过程的抽象,而 对象 是类的特定实例。 ***

  • 问题内容: 您能用几句话来解释一下吗: 为什么我们需要它/为什么它们使我们的生活更轻松? 如何对[Java中的简单示例]进行单元测试? 什么时候我们不需要它们/项目类型,我们可以不进行单元测试? 有用的链接 问题答案: 为什么我们需要它/为什么它们使我们的生活更轻松? 它允许您检查要测试的代码段的预期行为,并作为它必须满足的合同。 它还允许您安全地重构代码,而不会破坏其功能(合同)。 它使您可以通

  • 我不熟悉匕首。我创建了一个非常简单的单元测试,试图理解我应该如何使用dagger。不幸的是,它失败了。我可能还不了解匕首的一些基本原理。 而我的测试课失败了 我认为dagger会将B注入A,因为A希望注入B,DaggerModule包含一个@Providers注释方法,该方法创建B。 更新: 我发现当我像这样编写模块类时 将B注入A作品中。然而,我不理解为什么当模块有一个构造a实例的带注释的方法时

  • 问题内容: 第3、16、17、18和19行用*突出显示的含义是什么。有人可以解释他们的工作吗?我是python和编程新手 问题答案: 此代码中只有三行用*突出显示,但这是它们的含义: 第一行: 这是在声明 后面 的函数( test_Iframe 和 tearDown )的 类* 。在面向对象的编程中,使用一个类来创建“对象” 。可以将 类 视为数据/过程的抽象,而 对象 是类的特定实例。 ***