我有一个测试:
@Test
public void shouldAddCompany() throws Exception {
mockMvc.perform(post("/companies")
.param("name", "companyName"))
.andExpect(model().attribute("company",
hasProperty("name", is("companyName"))));
}
我的控制器方法如下:
@PostMapping("/companies")
public String displayCompaniesPost(@ModelAttribute Company company) {
companyService.save(company);
return "redirect:/companies";
}
如何在测试中检查公司属性?由于重定向和状态302,存在问题。
java.lang.AssertionError: Model attribute 'company'
Expected: hasProperty("name", is "companyName")
but: was null
我认为这是因为控制器因重定向而转向GET方法。当我删除此重定向时,一切正常,但我不想删除该重定向。
编辑(GetMapping):
@GetMapping({"/", "/companies"})
public String displayCompanies(Model model) {
model.addAttribute("company", new Company());
List<Company> companies = companyService.findAll();
model.addAttribute("companies", companies);
return "companies";
}
我认为问题是因为在getMapping中使用相同名称的addding属性,但是当我删除它时,它仍然无法正常工作。
答案 0 :(得分:3)
您需要修改您的方法。如果POST到控制器方法,并且它返回一个Redirect,你将无法访问该控制器设置的任何模型信息,它只返回带有Location Header的HTTP 302给客户端告诉它要去的新url(在这种情况下/companies
)。如果这是严格的单元测试,那么您可以测试此方法的范围。
我会考虑将其视为集成测试,并将测试更改为两个单独的步骤:
/companies
并验证响应是否为预期的重定向