In unserem Projekt schreiben wir einen Test, um zu überprüfen, ob der Controller die richtige Modellansicht liefert
@Test
public void controllerReturnsModelToOverzichtpage()
{
ModelAndView modelView = new ModelAndView();
KlasoverzichtController controller = new KlasoverzichtController();
modelView = controller.showOverzicht();
assertEquals("Klasoverzichtcontroller returns the wrong view ", modelView.getViewName(), "overzicht");
}
Dies gibt die Ausnahme null zurück.
Wir konfigurieren jetzt die @contextconfiguration, wissen jedoch nicht, wie Sie die richtige XML-Datei laden, die sich unter src\main\webapp\root\WEB-INF\root-context.xml befindet
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class TestOverzichtSenario{
....
Diese Dokumentation ist nicht klar genug, um zu verstehen
Gibt es einen Vorschlag, wie Sie sicherstellen können, dass die Kontextannotation die richtige XML-Datei lädt?
Edit v2
Ich habe die XML-Konfigurationsdateien aus dem Ordner webINF nach kopiert
src\main\resources\be\..a bunch of folders..\configuration\*.xml
und änderte die web.xml in webinf in
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:configuration/root-context.xml
classpath*:configuration/applicationContext-security.xml
</param-value>
und jetzt den Fehler bekommen
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]; nested exception is Java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.Java:341)
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.Java:302)
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:143)
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:178)
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:149)
org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.Java:124)
org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.Java:93)
org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.Java:130)
org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.Java:467)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:397)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.Java:442)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.Java:458)
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.Java:339)
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.Java:306)
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.Java:127)
javax.servlet.GenericServlet.init(GenericServlet.Java:212)
com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.invoke(HttpRequestOperationCollectionValve.Java:80)
org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102)
org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:293)
org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:849)
org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:583)
org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:379)
Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
Java.lang.Thread.run(Unknown Source)
Das ist der Grund, die Konfiguration nicht in webapp
zu setzen.
Soweit ich weiß, gibt es keine gute Möglichkeit, auf die Dateien im webapp
-Ordner aus den Komponententests zuzugreifen. Sie können Ihre Konfiguration stattdessen in src/main/resources
ablegen, sodass Sie von Ihren Gerätetests (wie in den Dokumenten beschrieben) sowie von der webapp (mit classpath:
-Präfix in contextConfigLocation
) darauf zugreifen können.
Siehe auch:
Unsere Tests sehen so aus (mit Maven und Spring 3.1):
@ContextConfiguration
(
{
"classpath:beans.xml",
"file:src/main/webapp/WEB-INF/spring/applicationContext.xml",
"file:src/main/webapp/WEB-INF/spring/dispatcher-data-servlet.xml",
"file:src/main/webapp/WEB-INF/spring/dispatcher-servlet.xml"
}
)
@RunWith(SpringJUnit4ClassRunner.class)
public class CCustomerCtrlTest
{
@Resource private ApplicationContext m_oApplicationContext;
@Autowired private RequestMappingHandlerAdapter m_oHandlerAdapter;
@Autowired private RequestMappingHandlerMapping m_oHandlerMapping;
private MockHttpServletRequest m_oRequest;
private MockHttpServletResponse m_oResp;
private CCustomerCtrl m_oCtrl;
// more code ....
}
Ich denke, das ist ein besonderes Problem. Maven kopiert die Dateien nicht aus /src/main/resources
in den Zieltestordner. Sie müssen dies selbst tun, indem Sie das Ressourcen-Plugin konfigurieren, wenn Sie dies unbedingt tun möchten.
Ein einfacherer Weg ist es, stattdessen eine testspezifische Kontextdefinition in das /src/test/resources
-Verzeichnis zu legen und zu laden über:
@ContextConfiguration(locations = { "classpath:mycontext.xml" })
Einfache Lösung ist
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/applicationContext.xml" })
vom frühling forum
Wir gebrauchen:
@ContextConfiguration(locations="file:WebContent/WEB-INF/spitterMVC-servlet.xml")
das Projekt ist ein dynamisches Eclipse-Webprojekt. Der Pfad lautet dann:
{project name}/WebContent/WEB-INF/spitterMVC-servlet.xml
Angenommen, Sie erstellen eine test-context.xml, die zum Testen von app-context.xml unabhängig ist, setzen Sie test-context.xml unter/src/test/resources. Haben Sie in der Testklasse die Annotation @ContextConfiguration oberhalb der Klassendefinition.
@ContextConfiguration(locations = "/test-context.xml")
public class MyTests {
...
}
Frühlingsdokument Kontextverwaltung
Laden der Datei von: {project}/src/main/webapp/WEB-INF/spring-dispatcher-servlet.xml
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring-dispatcher-servlet.xml" })
@WebAppConfiguration
public class TestClass {
@Test
public void test() {
// test definition here..
}
}
@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = {"/Beans.xml"})public Klasse DemoTest {}