Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Failed to load ApplicationContext for JUnit test of Spring controller

I want to write a test case to check my controller (getPersons). This is a server side code. I have confusion what should i put inside @ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/app-contest.xml"})

Secondly, I'm getting some errors like this:

Failed to load application context. Can not find the path [which I specified in @ContextConfiguration]

I have a structure like this:

 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(); } 

This is my Test

@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());  } 

Trace

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) 

Can some one please help me out to figure it out what's wrong here?

like image 747
Saurabh Avatar asked Jun 20 '13 17:06

Saurabh


People also ask

What is ApplicationContext failed to load?

However, sometimes in this situation, we may encounter the application context loading error “Failed to load ApplicationContext.” This error appears in the test classes because the application context isn't loaded in the test context.

How can you access the application context in a Spring integration test?

By default the ApplicationContext is loaded using the GenericXmlContextLoader which loads a context from XML Spring configuration files. You can then access beans from the ApplicationContext by annotating fields in your test class with @Autowired , @Resource , or @Inject .

What is spring ApplicationContext?

The ApplicationContext InterfaceThe Spring IoC container is responsible for managing the objects of an application. It uses dependency injection to achieve inversion of control. The interfaces BeanFactory and ApplicationContext represent the Spring IoC container.


2 Answers

As mentioned in the discussion: WEB-INF is not really part of the class path. If you use a common template, such as maven, use src/main/resources or src/test/resources to place the app-context.xml in. Then you can use classpath:.

Place your config file in src/main/resources/app-context.xml and use the following code:

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

You can also create your test context with different configurations of beans.

Place your config file into src/test/resources/test-app-context.xml and use:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:test-app-context.xml") public class PersonControllerTest {   ... } 
like image 101
Martin Strejc Avatar answered Oct 04 '22 00:10

Martin Strejc


There can be multiple root causes for this exception. For me, my mockMvc wasn't getting auto-configured. I solved this exception by using @WebMvcTest(MyController.class) at the class level. This annotation will disable full auto-configuration and instead apply only configuration relevant to MVC tests.

An alternative to this is, If you are looking to load your full application configuration and use MockMVC, you should consider @SpringBootTest combined with @AutoConfigureMockMvc rather than @WebMvcTest

like image 33
mahesh chakravarthi Avatar answered Oct 03 '22 23:10

mahesh chakravarthi