2013-06-20 63 views
21

我想編寫一個測試用例來檢查我的控制器(getPersons)。這是一個服務器端代碼。我有困惑我應該怎麼把裏面@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/app-contest.xml"})無法加載ApplicationContext進行Spring控制器的JUnit測試

其次,我得到一些錯誤是這樣的:

無法加載應用程序上下文。找不到[我在@ContextConfiguration指定]路徑

我有這樣的結構:

restAPI 
    *src/main/java 
     com.company.controller 
     personController.java 
    *Test 
     com.company.testController 
     personControllerTest.java 
    *src 
     main 
     webapp 
     WEBINF 
      app-context.xml 


@Autowired 
private PersonService personService; 

@RequestMapping(value="/t2/{yy_id}/person", method=RequestMethod.GET) 
@ResponseBody 
public PersonInfo[] getPersons() { 

    return personService.getPersons(); 
} 

這是我的測試

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:WEB-INF/app-context.xml"}) 
@WebAppConfiguration 
public class PersonControllerTest { 


@Autowired 
private WebApplicationContext wac; 

private MockMvc mockMvc; 

@Before 
public void setup() { 
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); 
} 

@Autowired 
private PersonService personService; 

@Test 
public void getPersons() throws Exception { 

    this.mockMvc.perform(get("/t2/1/person") 
      .accept(MediaType.APPLICATION_JSON)) 
      .andExpect(status().isOk()); 

} 

跟蹤

java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157) 
    at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:103) 
    at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:73) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:313) 
    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 [WEB-INF/application-context.xml]; nested exception is java.io.FileNotFoundException: class path resource [WEB-INF/application-context.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.web.GenericXmlWebContextLoader.loadBeanDefinitions(GenericXmlWebContextLoader.java:38) 
    at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:113) 
    at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:59) 
    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.TestContext.loadApplicationContext(TestContext.java:124) 
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148) 
    ... 24 more 
Caused by: java.io.FileNotFoundException: class path resource [WEB-INF/app-context.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) 

有人可以幫我解決這裏有什麼問題嗎?

+0

我認爲'WEB-INF'位置應該通過'file:/ WEB-INF/...'加載,而不是'classpath:WEB-INF'。 –

+0

我已經試過文件了,我仍然得到相同的錯誤 – Saurabh

+0

你確定它不是拼寫錯誤嗎? app-context.xml而不是app-contest.xml; o –

回答

19

正如在duscusion中提到的那樣:WEB-INF並不是真正的類路徑的一部分。如果您使用通用模板(如maven),請使用src/main/resources或src/test/resources將app-context.xml放入。然後你可以使用'classpath:'。

將您的配置文件到的src /主/資源/ APP-context.xml中和使用代碼

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:app-context.xml") 
public class PersonControllerTest { 
... 
} 

或者你可以用豆的不同配置YOUT測試環境。

將您的配置文件到的src /測試/資源/測試-APP-context.xml中和使用代碼

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:test-app-context.xml") 
public class PersonControllerTest { 
... 
} 
+0

我在項目中使用maven – Saurabh

+0

好的,我編輯過並加強我的答案,所以現在你可以將它應用到你的項目@Saurabh。 –

+2

在您提到的第一種情況下,您將app-context.xml文件放在src/main/resources中。但是當你運行測試時,它不會在那裏找到它,但是src/test/resources。那麼應該在哪裏放置單元測試? – mcanti

0

如果您正在使用Maven,添加下面的配置在你的pom.xml:

<build> 
    <testResources> 
       <testResource> 
        <directory>src/main/webapp</directory> 
       </testResource> 
    </testResources> 
</build> 

使用此配置,您將能夠訪問WEB-INF文件夾中的xml文件。 來自Maven POM參考: testResources元素塊包含testResource元素。它們的定義與資源元素相似,但在測試階段自然使用。

相關問題