2013-06-20 61 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元素。它们的定义与资源元素相似,但在测试阶段自然使用。

相关问题