2013-07-13 58 views
2

为了测试我DAO和自动自动装配我的对象,我创建的JUnit以下测试类:Spring MVC和JUnit的:无法加载的ApplicationContext

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"/spring-servlet.xml"}) 
public class MyTest { 

    // Other stuff here 
} 

运行它,我得到以下错误后:

java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99) 
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:122) 
    at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:105) 
    at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:74) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:312) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:284) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [spring-servlet.xml]; nested exception is java.io.FileNotFoundException: class path resource [spring-servlet.xml] cannot be opened because it does not exist 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:243) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadBeanDefinitions(AbstractGenericContextLoader.java:233) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:117) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60) 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100) 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:248) 
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64) 
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91) 
    ... 25 more 
Caused by: java.io.FileNotFoundException: class path resource [spring-servlet.xml] cannot be opened because it does not exist 
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:157) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:328) 
    ... 37 more 

吾道是下:

MyProject\src\main\java\org\baudo\dao 

我的测试是在:

MyProject\src\test\java\org\baudo\dao 

我为spring-servlet.xml是下:

MyProject\src\main\webapp\WEB-INF  

我试图传递给@ContextConfiguration许多不同的路径和我把我的弹簧servlet.xml的应用程序中的每一个可能的路径。 这使我认为这不是一个路径问题,我认为还有其他事情正在发生。

这是我如何配置我想在Spring自动装配对象:

<bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
<property name="dataSource" ref="dataSource" /> 
<property name="configLocation"> 
    <value>classpath:hibernate.cfg.xml</value> 
</property> 
<property name="configurationClass"> 
    <value>org.hibernate.cfg.AnnotationConfiguration</value> 
</property> 
<property name="hibernateProperties"> 
    <props> 
     <prop key="hibernate.dialect">${jdbc.dialect}</prop> 
     <prop key="hibernate.show_sql">true</prop> 
    </props> 
</property> 
</bean> 

当我运行应用程序它正确地自动连接,而不是在测试期间。这就是我添加@ContextConfiguration的原因。

我也有我的Spring配置行:

<tx:annotation-driven /> 

这是我添加测试到的pom.xml去依赖

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.11</version> 
</dependency>    
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-test</artifactId> 
    <version>3.2.3.RELEASE</version> 
</dependency> 

Oher信息:这是一个Web应用程序与Spring MVC和Hibernate。我通过右键单击测试文件并选择“run as”运行单元测试 - >“JUnit测试”

但我注意到Eclipse并不关心这个特定的JUnit,因为它使用自己的Java开发工具插入。但它是JUnit 4.

有什么不对?我怎样才能为单元测试启用自动装配?

回答

3

正如堆栈跟踪所示,Spring runner在claspath中查找XML文件。所以假设一个标准的Maven布局,并且由于这个XML文件被测试使用,它应该在src/test/resources之下。

看起来你想为你的应用程序和测试使用相同的文件。这是一个奇怪的选择,因为DAO测试不应该使用与真正的MVC应用程序相同的bean(控制器等)。

+0

我做了,现在我有一个不同的消息是这样的:由于:java.io.FileNotFoundException:类路径资源[WEB-INF/jdbc.properties]无法打开,因为它不存在 – user1883212

+0

听起来像是错误现在消失了,但自动装配仍在进行中,这导致空指针异常 – user1883212

+0

编辑您的问题并显示异常和相关代码的堆栈跟踪,或询问另一个问题。 –

相关问题