2

次の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を使用しています。

4

1 に答える 1

3

doPrint() の出力に見られるように、FlashMap には値が null の属性「message」が含まれています。

.andExpect(flash().attributeExists("message"))

を呼び出しますがattributeExists()null でない属性FlashAttributeResultMatcherがあるかどうかのみをチェックします。

/**
     * Assert the existence of the given flash attributes.
     */
    public <T> ResultMatcher attributeExists(final String... names) {
        return new ResultMatcher() {
            public void match(MvcResult result) throws Exception {
                for (String name : names) {
                    assertTrue("Flash attribute [" + name + "] does not exist", result.getFlashMap().get(name) != null);
                }
            }
        };
    }

したがって、アサーションは失敗します。

于 2013-09-27T13:44:22.363 に答える