Le test d'un Spring MVC méthode de contrôleur avec le Printemps MockMvc* les classes

Je suis en train de tester la suite de Spring mvc méthode de contrôleur:

@RequestMapping(value = "/preferences/email", method = RequestMethod.POST, produces = "text/html")
public String modifyEmail(@ModelAttribute @Validated({ Validation.EmailModification.class }) EmailInfo emailInfo, BindingResult bindingResult, Model model, Locale locale) {
    Member member = memberService.retrieveCurrentMember();
    if (!preferencesService.isEmailAvailable(emailInfo.getEmail())) {
        if (member.getEmail().equals(emailInfo.getEmail())) {
            bindingResult.addError(new FieldError("emailInfo", "email", messageSource.getMessage("controller.preferences.same_email", null, locale)));
        } else {
            bindingResult.addError(new FieldError("emailInfo", "email", messageSource.getMessage("controller.preferences.email_already_used", null, locale)));
        }
    }
    if (bindingResult.hasErrors()) {
        model.addAttribute("emailInfo", emailInfo);
        return "preferences";
    }
    preferencesService.modifyEmail(member, emailInfo.getEmail());
    return "redirect:/preferences/email";
}

Ici est la EmailInfo bean:

@RooEquals
@RooJavaBean
public class EmailInfo {

    @NotNull(groups = { Validation.EmailModification.class })
    @Pattern(regexp = "^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)+$", groups = { Validation.EmailModification.class })
    private String email;

    private boolean activated;

    private String token;
}

Ici est la classe de test:

@ContextConfiguration
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class PreferenceControllerTest {
@Autowired
private WebApplicationContext ctx;
private MockMvc mockMvc;
@Autowired
private MemberService memberService;
@Autowired
private PreferencesService preferencesService;
@Autowired
private MemberRepository memberRepository;
@Autowired
private SigninService signinService;
@Autowired
private MessageSource messageSource;
@Before
public void setup() {
mockMvc = webAppContextSetup(ctx).build();
Member currentMember = new Member();
currentMember.setEmail("[email protected]");
when(memberService.retrieveCurrentMember()).thenReturn(currentMember);
when(preferencesService.isEmailAvailable("[email protected]")).thenReturn(Boolean.FALSE);
}
@Test
public void test() throws Exception {
mockMvc.perform(post("/preferences/email")//
.param("email", "[email protected]"))//
.andDo(print()).andExpect(model().attributeHasNoErrors("emailInfo", "email"));
}
@Configuration
public static class testConfiguration {
@Bean
public PreferenceController preferenceController() {
return new PreferenceController();
}
@Bean
public PreferencesService preferenceService() {
return mock(PreferencesService.class);
}
@Bean
public MemberService memberService() {
return mock(MemberService.class);
}
@Bean
public MemberRepository memberRepository() {
return mock(MemberRepository.class);
}
@Bean
public SigninService signinService() {
return mock(SigninService.class);
}
@Bean
public MessageSource messageSource() {
return mock(MessageSource.class);
}
}
}

Curieusement j'obtiens le résultat suivant:

MockHttpServletRequest:
HTTP Method = POST
Request URI = /preferences/email
Parameters = {email=[newEmail@example.com]}
Headers = {}
Handler:
Type = com.bignibou.controller.PreferenceController
Async:
Was async started = false
Async result = null
Resolved Exception:
Type = null
ModelAndView:
View name = preferences
View = null
Attribute = emailInfo
value = com.bignibou.controller.helpers.EmailInfo@9a56c123
errors = [Field error in object 'emailInfo' on field 'email': rejected value [null]; codes []; arguments []; default message [null]]
FlashMap:
MockHttpServletResponse:
Status = 200
Error message = null
Headers = {}
Content type = null
Body = 
Forwarded URL = preferences
Redirected URL = null
Cookies = []

Le test échoue avec le dessus de la sortie et je ne suis pas sûr pourquoi. J'attend le test à passer, comme l'adresse e-mail est disponible.

Quelqu'un peut s'il vous plaît aider?

edit 1:

Le suivant ne fonctionne pas:

@Before
public void setup() {
mockMvc = webAppContextSetup(ctx).build();
Member currentMember = new Member();
currentMember.setEmail("[email protected]");
when(memberService.retrieveCurrentMember()).thenReturn(currentMember);
when(preferencesService.isEmailAvailable(eq("[email protected]"))).thenReturn(Boolean.FALSE);
when(preferencesService.isEmailAvailable(eq("[email protected]"))).thenReturn(Boolean.TRUE);
}

edit 2:

J'ai pu obtenir est de travailler avec les edit 1 plus le test ci-dessous:

@Test
public void test() throws Exception {
mockMvc.perform(post("/preferences/email")//
.param("email", "[email protected]"))//
.andDo(print())//
.andExpect(model().attributeHasNoErrors("emailInfo"));
}

OriginalL'auteur balteo | 2013-04-26