2013-07-13 56 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

編輯您的問題並顯示異常和相關代碼的堆棧跟蹤,或詢問另一個問題。 –

相關問題