2017-05-03 7 views
0

Ich habe eine grundlegende SpringBoot App. Verwenden von Spring Initializer, eingebetteter Tomcat-, Thymeleaf-Vorlagen-Engine und Paket als ausführbare JAR-Datei.Spring Boot - MockMVC forwardedUrl mit Thymoleaf

Ich habe diesen Controller:

@Controller 
@RequestMapping("/deviceevent") 
public class DeviceEventController { 

    @RequestMapping(value={ "/list"}, method = { RequestMethod.GET}) 
    public String deviceeventList() { 

     return "tdk/deviceEvent/DeviceEventList"; 
    } 
} 

und diese anderen Testklasse. Tests mit dem MockMVC-Framework von Spring. Dies treibt eine MVC-Anwendung in einem Test, als ob es in einem Container ausgeführt wird,

@RunWith(SpringJUnit4ClassRunner.class) 
    @WebAppConfiguration 
    @WebMvcTest 
    public class MockMvcTests { 

     // Pull in the application context created by @ContextConfiguration 
     @Autowired 
     private WebApplicationContext wac; 

     private MockMvc mockMvc; 

     @Before 
     public void setup() { 
      // Setup MockMVC to use our Spring Configuration 
      this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); 
     } 


     @Test 
     public void getDeviceEventsTest() throws Exception { 
      this.mockMvc 
        .perform(get("/deviceevent/list") // 
          .accept(MediaType.parseMediaType("text/html;charset=UTF-8"))) 
        .andExpect(status().isOk()) // 
        .andExpect(model().size(1)) // 
.andExpect(forwardedUrl("tdk/deviceEvent/DeviceEventList")); 
     } 

Aber ich habe diesen Fehler in der URL weitergeleitet. Früher habe ich immer diese Methode in JSP, nie in Thymeleaf, aber ich denke, dass es das gleiche ist:

java.lang.AssertionError: Forwarded URL expected:</tdk/deviceEvent/DeviceEventList> but was:<null> 
+0

können Sie mit Ihrem HTML-Code bieten, fiel ich, dass beim Übergeben von Objekt erhalten Sie null Wert –

Antwort

0

Unter der Annahme eines Standard-Thymeleaf/Spring-Setups sieht es so aus, als bestünde ein Missverständnis darüber, was der Controller tut ng - wenn der Controller den String "tdk/deviceEvent/DeviceEventList" zurückgibt, leitet er die HTTP-Anfrage nicht irgendwo weiter, sondern gibt einen View-Namen zurück.

Bei einem normalen Spring-Thymeleaf-Setup entspricht diese Zeichenfolge dem Namen einer Thymleafeld-Ansicht, die beim Auftreffen auf diesen Endpunkt gerendert wird (ich gehe davon aus, dass der Controller nur eine normale Webseite bedient - dieser Pfad entspricht also wahrscheinlich einer Datei) Pfad am wahrscheinlichsten in src/main/resources - aber wieder hängt dies sehr von Ihrer Spring-Konfiguration ab - an diesem Punkt wurde die HTTP-Anfrage nicht an den Benutzer zurückgegeben, und Spring verarbeitet sie noch immer - und versucht, die HTML-Ansicht vor der Rückkehr zu rendern für den Benutzer. Die weitergeleitete URL wird verwendet, wenn Spring nichts rendert, sondern stattdessen eine HTTP-Antwort an den Benutzer zurückgibt, um sie an eine andere URL (die einen anderen Spring-Request-Response-Prozess startet) mit einem 301/302-Mechanismus weiterzuleiten.

Man beachte den Unterschied in der folgenden Methoden:

@RequestMapping(value="/document", method=RequestMethod.GET) 
public String newDocumentSettings(Model model){ 
    model.addAllAttributes(contentManagementService.documentToJson()); 
    return "pages/document-settings"; 
} 


@RequestMapping(value="/document", method=RequestMethod.POST) 
public String createNewDocument(@RequestParam String title, @RequestParam String overview, @RequestParam String tags){ 
    Document doc = documentService.createDocument(title, overview, tags); 
    return "redirect:/document/${doc.url}/1?getting-started"; 
} 

Die erste rendert die Vorlage bei der gegebenen Filepath, die zweite gibt einen Umleitungsbefehl an den Browser eine andere HTTP-Anforderung an den angegebenen URL zu machen.

In jedem Fall ist die forwardedUrl in Ihrem Testfall, weil die HTTP-Antwort keine URL zu weiterleiten hat (weil es die HTML zurückgibt). Wenn Sie ein Weiterleitungsverhalten wünschen (zB wenn Sie die Antwort wirklich vervollständigen möchten und der Browser eine zweite HTTP-Anfrage machen möchte), müssten Sie wahrscheinlich den Controller entsprechend aktualisieren. Wenn Sie jedoch mit der gerenderten HTML-Seite zufrieden sind, dann ist der Test ungültig (sehen Sie sich das Thymeleaf-Testframework an, um zu sehen, wie man Templating testet).

Vorbehalt: Dies basiert auf der Annahme der Standard-Spring-Boot-Konfiguration - wenn Sie andere Config haben, wobei diese Zeichenfolge in einer weitergeleiteten HTTP-Anfrage führt, dann gilt dies nicht!

0

eine Vermutung hier machen, aber die URL tdk/deviceEvent/DeviceEventList ist wahrscheinlich nicht definiert. Versuchen Sie es mit dem mit Ihrem Kontext zugeordnet URL zu ersetzen (bearbeiten je nach Bedarf):

@Test 
    public void getDeviceEventsTest() throws Exception { 
     this.mockMvc 
       .perform(get("/deviceevent/list") 
         .accept(MediaType.parseMediaType("text/html;charset=UTF-8"))) 
       .andExpect(status().isOk()) 
       .andExpect(model().size(1)) 
       .andExpect(forwardedUrl("/WEB-INF/tdk/deviceEvent/DeviceEventList.html")); 
    } 

Abgesehen statt:

@RequestMapping(value={ "/list"}, method = { RequestMethod.GET})

Sie die Kurz verwenden:

@GetMapping("/list")

+0

lesen Sie den Fehler: aber war:

Verwandte Themen