Spring 3.0 Junit Test DispatcherServlet
-
27-10-2019 - |
Frage
Ich versuche meine Anwendung mit junit zu testen.
Deshalb habe ich die folgende Klasse eingerichtet:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/META-INF/spring/applicationContext-test.xml" )
@TransactionConfiguration
@Transactional
public class DispatcherServletTest extends AbstractJUnit4SpringContextTests {
private MockHttpServletRequest request;
private MockHttpServletResponse response;
private DispatcherServlet dispatcher;
@Before
public void setUp() throws Exception {
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
MockServletConfig config = new MockServletConfig("myapp");
config.addInitParameter("contextConfigLocation","classpath*:webmvc-config.xml");
dispatcher = new DispatcherServlet();
dispatcher.init(config);
}
//test cases
}
Das Problem ist also, dass mein Dispatcher-Servlet anscheinend keine Anforderung an einen meiner Controller senden kann.
Ich denke, dass die Konfiguration etwas enthält - contextConfigurationLocation. Es sieht so aus, als ob er die Datei finden kann (andernfalls würde dies eine Ausnahme auslösen), lädt jedoch keine Konfiguration
Der Logger sagt:
org.springframework.web.servlet.PageNotFound - Keine Zuordnung für HTTP-Anforderung mit URI [http:// localhost: 8080 / myapp / abc] gefunden
Aber ich habe absolut keine Ahnung, was los ist ...
Ich würde mich über jede Hilfe freuen!
Vielen Dank im Voraus
Lösung
Minen funktionieren einwandfrei. Versuchen Sie die folgenden Optimierungen.
- Wenn Sie Junit4 verwenden und Ihre Testklasse nicht erweitern müssen, sollte der Junit-Läufer den Trick ausführen.
-
Laden Sie die Kontextkonfiguration über den Klassenpfad und stellen Sie sicher, dass Sie über den Testklassenpfad darauf zugreifen können
@ContextConfiguration(locations={"classpath:applicationContext-test.xml"})
-
Testen Sie dann einfach die mit Anmerkungen versehenen Controller.Ich mache es so:
@Test @Transactional public void testAnnotatedListUser() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletResponse response = new MockHttpServletResponse(); AnnotationMethodHandlerAdapter handlerAdpt = new AnnotationMethodHandlerAdapter(); request.setRequestURI("/you/URIhere"); ModelAndView mav = handlerAdpt.handle(request, response, this.controller); assertEquals("Incorrect view name returned", "myexpectedviewname", mav.getViewName()); }
Andere Tipps
In meiner Frage gibt es mehrere Probleme:
Zunächst ist es nicht möglich, die AbstractJUnit4SpringContextTests zu erweitern und @RunWith (...) zu verwenden, da dies dasselbe ist.
Zweitens sollten Sie nicht den dispatcherServlert, sondern einen Handler verwenden, indem Sie den Handler in Ihrer application.xml definieren und ihn im Testfall über den privaten Handler @Autowire Handler automatisch verdrahten ...
Dann sollte alles gut funktionieren!