Junit with Spring - TestContextManager [ERROR]允许TestExecutionListener捕获异常

时间:2012-07-22 15:38:35

标签: spring tomcat maven junit integration-testing

在我的Spring-Maven - Tomcat web app上的Hibernate-Mysql runnint中,我使用2种不同的Junit类别运行2种类型的Junit集成测试:

  1. LocalTests - 正在运行(不需要服务器),直接调用我的Web图层方法(在这种情况下是运动衫)。
  2. HttpTests - 模拟客户端并通过http请求调用我的Web层,需要启动并运行tomcat。
  3. 在每个测试课程上面我都有:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { "classpath:testApplicationContext.xml" })
    

    我的测试套件看起来像那样(这是2个中的一个,每个类别都有一个):

    @RunWith(Categories.class)
    @IncludeCategory(HttpTest.class)
    @SuiteClasses({ ...All My Test Classes... })
    public class HttpSuiteITCase {
    
        // Excluded: NotificationTests, ImageHttpTests
    
        /**
         * Run once before any of the test methods.
         */
        @BeforeClass
        public static void setTestsConfigurations() {
        TestConfiguration.setup(false);
        }
    

    我的testApplicationContext实际上是空的,它只包含组件扫描:

    <context:component-scan base-package="com.company.app" />
    

    当我运行我的本地测试时,一切运行顺利,但是当我调用HTTP测试时,它会崩溃:

    2012-07-22 17:56:13 DefaultListableBeanFactory [INFO] Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2598a35d: defining beans [httpBrandManagerTestsProxy,httpClubTestsProxy,<HERE THERE'S A BUNCH OF SPRING BEANS>,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,contextApplicationContextProvider,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
    2012-07-22 17:56:13 TestContextManager [ERROR] Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@29565e9d] to prepare test instance [integrationTests.http.tests.UserLoginDataHttpTests@480d41f3]
    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)
        at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
    

    我试过很多东西没什么用的:( 我的testApplicationContext位于test / resources文件夹下。

    我注意到异常标记了一个特定的类:UserLoginDataHttpTests。 但我看不出这个类有什么特别之处,只是常规的春豆。

    提前致谢!

3 个答案:

答案 0 :(得分:6)

问题发生在Spring上下文在我的一个侦听器之前加载,这是在web.xml中定义的。 Spring正在初始化一些使用非弹簧clases的bes,这些弹簧使用我自己的监听器进行初始化。要解决这个问题,我应该确保我的听众先跑。

答案 1 :(得分:0)

对我来说,添加VM选项工作

为此测试用例将此添加到“ VM选项”中:-Djavax.xml.parsers.DocumentBuilderFactory = com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory = com.sun。 org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

答案 2 :(得分:0)

除上述答案外。您还应该寻找“ caused by”,以查看是否存在任何依赖项解析问题。例如,如果您正在测试的类是MyService.java,并且它使用依赖项MyRepository.java。然后,您应确保在测试类中将所有此类依赖项模拟或自动接线。