次のSpring MVCコントローラーメソッドをテストしています:
@RequestMapping(value = "/passwordReset", method = RequestMethod.POST, produces = "text/html")
public String resetPassword(@Validated({ ValidationGroups.PasswordReset.class }) @ModelAttribute PasswordInfo passwordInfo,
BindingResult bindingResult, Model model, RedirectAttributes redirectAttributes, Locale locale) {
if (bindingResult.hasErrors()) {
model.addAttribute("passwordInfo", passwordInfo);
return "passwordReset";
}
redirectAttributes.addFlashAttribute("message", messageSource.getMessage("controller.preference.password_reset_ok", null, locale));
Member member = preferenceService.findMemberByToken(passwordInfo.getToken());
preferenceService.modifyPassword(member, passwordInfo.getNewPassword());
signinService.signin(member);
return "redirect:/preference/email";
}
これが私のテスト方法です:
@Test
public void resetPasswordShouldHaveNormalInteractions() throws Exception {
Member member = new Member();
when(preferenceService.findMemberByToken(eq("valid-token"))).thenReturn(member);
mockMvc.perform(post("/preference/passwordReset")//
.param("newPassword", "valid-password")//
.param("token", "valid-token"))//
.andDo(print())
.andExpect(redirectedUrl("/preference/email"))//
.andExpect(flash().attributeExists("message"))//FAILS HERE
.andExpect(flash().attributeCount(1));
verify(preferenceService).modifyPassword(eq(member), eq("valid-password"));
verify(signinService).signin(eq(member));
}
「メッセージ」フラッシュ属性がリダイレクト属性マップに追加されていても、Spring MVC テストはそれに気付かないようで、上記の行は体系的FAILS HERE
にテストに失敗します!
flash 属性が実際に FlashMap に含まれていることmessage
がわかります(以下を参照doPrint()
)。
MockHttpServletRequest:
HTTP Method = POST
Request URI = /preference/passwordReset
Parameters = {newPassword=[valid-password], token=[valid-token]}
Headers = {}
Handler:
Type = com.bignibou.controller.preference.PreferenceController
Method = public java.lang.String com.bignibou.controller.preference.PreferenceController.resetPassword(com.bignibou.controller.preference.PasswordInfo,org.springframework.validation.BindingResult,org.springframework.ui.Model,org.springframework.web.servlet.mvc.support.RedirectAttributes,java.util.Locale)
Async:
Was async started = false
Async result = null
Resolved Exception:
Type = null
ModelAndView:
View name = redirect:/preference/email
View = null
Model = null
FlashMap:
Attribute = message
value = null
MockHttpServletResponse:
Status = 302
Error message = null
Headers = {Location=[/preference/email]}
Content type = null
Body =
Forwarded URL = null
Redirected URL = /preference/email
Cookies = []
誰でも助けてもらえますか?参考までに、私はSpring 3.2.2を使用しています。