2010-12-07 2 views
43

In unserem Projekt setzen writting einen Test zu überprüfen, ob der Controller den richtigen Model-View gibtFrühling @ContextConfiguration wie Sie die richtige Position für den xml wir

@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.

Wir konfigurieren jetzt die @contextconfiguration aber wir wissen nicht, wie das Recht xml zu laden, die \ main \ webapp \ root \ WEB-INF \ root-context.xml

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class TestOverzichtSenario{ 
.... 
an src befindet

This documentation isn't clear enough to understand

Irgendwelche Vorschläge, um sicherzustellen, dass die Contextannotation die richtige XML lädt?

bearbeiten v2

kopiert ich die Konfiguration XML-Dateien aus dem Ordner WEBINF

src\main\resources\be\..a bunch of folders..\configuration\*.xml 

und änderte die web.xml in WEBINF zu

<param-name>contextConfigLocation</param-name> 
<param-value> 
      classpath*:configuration/root-context.xml 
      classpath*:configuration/applicationContext-security.xml 
     </param-value> 

und jetzt bekommen der Fehler

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) 

Antwort

37

Das ist der Grund, keine Konfiguration in webapp zu setzen.

Soweit ich weiß, gibt es keine guten Möglichkeiten, auf Dateien in webapp Ordner von den Komponententests zuzugreifen. Sie können stattdessen Ihre Konfiguration in src/main/resources setzen, so dass Sie von Ihren Komponententests (wie in der Dokumentation beschrieben), sowie von der Webanwendung (mit classpath: Präfix in contextConfigLocation) darauf zugreifen können.

Siehe auch:

+1

Haben Sie Dokumentationsreferenzen, was "classpath:" tut? – David

+0

@Dvd Prd: Aktualisiert – axtavt

+0

thx, können Sie meine Änderungen überprüfen? – David

19

Dies ist ein Maven-spezifisches Problem ist, denke ich. Maven kopiert die Dateien von /src/main/resources nicht in den target-test-Ordner. Sie müssen dies selbst tun, indem Sie das Ressourcen-Plugin konfigurieren, wenn Sie unbedingt diesen Weg gehen wollen.

Ein einfacherer Weg ist stattdessen auf einen Test spezifischen Kontext-Definition in dem über /src/test/resources Verzeichnis und Last gelegt:

@ContextConfiguration(locations = { "classpath:mycontext.xml" }) 
+0

/src/main/resources sollte nicht in die target/test-classes kopiert werden. Die Testklassen –

+4

/src/main/resources sollten ** not ** in den Ordner target/test-classes kopiert werden. Test-Klassen sind für Testressourcen, d. h. src/test/java und src/test/resources. src/main/resources wird in target/classes kopiert, und target/classes wird beim Ausführen von Tests in den Klassenpfad eingefügt, und daher können Spring-Kontextdateien in src/main/resources in Unit Tests als Klassenpfadressource geladen werden, z. src/main/resources/spring/my-context.xml kann als @ContextConfiguration ({"/ spring/my-context.xml"}) geladen werden –

+0

@Dan: Ich würde sagen, dass, wenn Sie z.B. die config aus 'main' im' test'-Kontext wiederverwenden (Teile davon), ist es sinnvoll, maven die vorhandenen Dateien für die Tests mit dem maven-resources-plugin kopieren zu lassen. So zu sagen "sollte ** nicht **" kopiert werden, ist ein bisschen zu hart. Natürlich macht Maven das nicht standardmäßig, aber wenn Sie selbst gute Gründe dafür haben ... warum nicht? – fasseg

5

Wir verwenden:

@ContextConfiguration(locations="file:WebContent/WEB-INF/spitterMVC-servlet.xml") 

das Projekt ist ein Eclipse-dynamische Web-Projekt, dann ist der Pfad:

{project name}/WebContent/WEB-INF/spitterMVC-servlet.xml 
66

Unsere Tests sehen so aus (mit M Aven und Frühling 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 .... 
} 
+0

Danke für das Beispiel – David

+0

Vielen Dank, es löst mein Problem! Aber denkst du, der Ansatz: "Datei: Pfad" ist richtig? – Andrew

10

Einfache Lösung ist

@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/applicationContext.xml" }) 

von spring forum

4

Angenommen, Sie einen Test-context.xml erstellen werden, die von App-context.xml zum Testen unabhängig ist, Setzen Sie test-context.xml unter/src/test/resources. Fügen Sie in der Testklasse die Annotation @ContextConfiguration über die Klassendefinition ein.

@ContextConfiguration(locations = "/test-context.xml") 
public class MyTests { 
    ... 
} 

Frühling Dokument Context management

0

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = { "/Beans.xml"}) public class DemoTest {}

2

Laden der Datei aus: {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..   
    } 
} 
-1

Manchmal kann es etwas ziemlich einfach sein wie Ihre Ressourcendatei in Test classses Ordner aufgrund t fehlt o einige Aufräumarbeiten.

Verwandte Themen