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
Vous devez vous connecter pour publier un commentaire.
:
De réglage du paramètre de la requête de la chaîne de valeur. Cependant vous n'avez pas montré votre conversion de la Chaîne de EmailInfo.
Dans votre test vous êtes à la vérification du domaine de la emailInfo appelée e-mail.
Je ne suis pas sûr de ce que c'est ?
Ce qui est censé faire, vous avez injecté votre preferenceService à l'aide de autocâblés.
votre méthode de contrôleur prend un argument de type EmailInfo emailInfo, hwoever votre test soumet une Chaîne de caractères avec le nom de e-mail.
Mais je ne peut passer à la Chaîne puis-je? Est-il possible de passer un objet de haricots? Par la façon dont je l'ai fait essayer
.param("emailInfo.email", "[email protected]"))
en vain...ouais exactement, comment faire covnert en emaiLInfo ? Vous needa conversionservice /deserializer
Je n'ai pas de convertir quoi que ce soit comme par maintenant. Pouvez-vous indiquer comment faire s'il vous plaît?
OriginalL'auteur NimChimpsky
Updae pour répondre à un commentaire.
dans votre contrôleur essayer
String email=emailInfo.getEmail();
au lieu deif(!preferencesService.isEmailAvailable(email))){
if (!preferencesService.isEmailAvailable(emailInfo.getEmail())) {
Pas sûr, d'une solution possible
Ou essayer
Ae-vous à l'aide de Mockito pour mettre en œuvre les moqueries?
Je ne suis pas sûr à 100%, mais voici Comment je comprends votre code.
si
preferencesService.isEmailAvailable
retourne true, alors vous êtes force de retournerfalse
dansmock exercise
donc dans le
mock exercise
preferencesService.isEmailAvailable
retournera toujoursfalse
.Maintenant dans votre
Controller
Si
preferencesService.isEmailAvailable
estfalse
puis!
fairetrue
donc le code sera toujours aller à l'intérieur deif
Bloc , et vous obtiendrezField Error
, et doncTest fails
.OriginalL'auteur rahul maindargi