Frage Spring MVC Test Post Methode mit Controller Redirect


Ich habe einen Test:

@Test
public void shouldAddCompany() throws Exception {
    mockMvc.perform(post("/companies")
            .param("name", "companyName"))
            .andExpect(model().attribute("company",
                    hasProperty("name", is("companyName"))));

}

und meine Controller-Methode sieht so aus:

@PostMapping("/companies")
public String displayCompaniesPost(@ModelAttribute Company company) {
    companyService.save(company);
    return "redirect:/companies";
}

Wie kann ich das Firmenattribut im Test überprüfen? Aufgrund der Umleitung und des Status 302 liegt ein Problem vor.

 java.lang.AssertionError: Model attribute 'company'
 Expected: hasProperty("name", is "companyName")
 but: was null

Ich denke, es kommt vor, weil Controller wegen Umleitung GET-Methode wird. Wenn ich diese Umleitung entferne, ist alles in Ordnung, aber ich möchte diese Umleitung nicht entfernen.

BEARBEITEN (GetMapping):

@GetMapping({"/", "/companies"})
public String displayCompanies(Model model) {
    model.addAttribute("company", new Company());
    List<Company> companies = companyService.findAll();
    model.addAttribute("companies", companies);
    return "companies";
}

Ich dachte, das Problem liegt daran, Attribut in getMapping mit demselben Namen hinzuzufügen, aber wenn ich es entfernte, funktioniert es immer noch nicht.


6
2017-08-23 14:27


Ursprung


Antworten:


Sie müssen Ihren Ansatz ändern. Wenn Sie an eine Controller-Methode POST senden und eine Redirect zurückgibt, haben Sie keine Möglichkeit, auf Modellinformationen zuzugreifen, die von diesem Controller festgelegt wurden, sondern gibt nur HTTP 302 mit einem Location Header an den Client zurück und teilt ihm die neue URL mit. in diesem Fall GET /companies). Wenn dies ein streng einheitlicher Test ist, ist das der Umfang dessen, was Sie für diese Methode testen können.

Ich würde es stattdessen als Integrationstest betrachten und den Test so ändern, dass er zwei separate Schritte umfasst:

  1. POST /companies und validiere, dass die Antwort die erwartete Weiterleitung ist
  2. BEKOMMEN /companies und bestätigen Sie, dass die Liste der zurückgegebenen Unternehmen die neue Firma enthält, die Sie in Schritt 1 gebucht haben

3
2017-08-24 14:55