Interrogation à propos de Spring MVC test de l'API du modèle().attribut() la méthode
Je suis en train de tester le contrôleur suivant la méthode à l'aide de la Spring MVC test API:
@RequestMapping(value = "/preference/email", method = RequestMethod.GET, produces = "text/html")
public String emailForm(@ModelAttribute EmailInfo emailInfo, Model model, @CurrentMember Member member) {
emailInfo.setEmail(member.getEmail());
emailInfo.setActivated(member.isActivated());
emailInfo.setToken(member.getToken());
model.addAttribute("emailInfo", emailInfo);
return "preference";
}
Quand je debug la suite de la méthode d'essai...
@Test
public void shouldPopulateEmailInfo() throws Exception {
when(currentMemberHandlerMethodArgumentResolver.supportsParameter(any(MethodParameter.class))).thenReturn(Boolean.TRUE);
when(currentMemberHandlerMethodArgumentResolver.resolveArgument(any(MethodParameter.class), any(ModelAndViewContainer.class), any(NativeWebRequest.class), any(WebDataBinderFactory.class))).thenReturn(currentMember);
mockMvc.perform(get("/preference/email"))//
.andDo(print())//
.andExpect(model().attribute("emailInfo.email", "[email protected]"));//
}
... Je ne vois que "[email protected]" est réglé sur la champ email de emailInfo.
Cependant, j'ai systématiquement:
java.lang.AssertionError: Model attribute 'emailInfo.email' expected:<currentMember@example.com> but was:<null>
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60)
at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:89)
at org.springframework.test.web.servlet.result.ModelResultMatchers$2.match(ModelResultMatchers.java:68)
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:141)
at com.bignibou.tests.controller.preference.PreferenceControllerEmailManagementTest.shouldPopulateEmailInfo(PreferenceControllerEmailManagementTest.java:109)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Il y a quelque chose que je ne comprends pas avec le Spring Mvc Test de l'API.... Quelqu'un peut s'il vous plaît aider?
modifier: Voici ce que j'ai mis au point après la prise en compte de la condition de répondre:
.andExpect(model().attribute("emailInfo", Matchers.hasProperty("email", Matchers.equalTo("[email protected]"))));//
Il fonctionne très bien maintenant.
Cela fonctionne bien à la suite notamment de la hamcrest de dépendance.
OriginalL'auteur balteo | 2013-09-20
Vous devez vous connecter pour publier un commentaire.
Model
attributs sont de type Chaîne touche un Objet-valeur des paires. Il n'y a pas d'expression de la résolution en cours. Lorsque vous neVous demandez si il y a un
Model
attribut avec les principauxemailInfo.email
qui a de la valeur spécifiée. La réponse est évidemment non puisque vous n'avez pas deModel
attribut avec une telle clé.Ce que vous avez est
qui est un
Model
attribut avec les principauxemailInfo
qui contient un objet de typeEmailInfo
. Vous aurez besoin de comparer laemail
domaine de laEmailInfo
objet vous-même.C'est un
static
méthode deMockMvcResultMatchers
. Importer de manière appropriée.OriginalL'auteur Sotirios Delimanolis
Comme Sotirios souligné,
model().attribute("attributeName")
l'habitude de vous permettre de naviguer et il va utiliser l'ensemble comme un nom.Cependant, vous pouvez utiliser cette méthode plutôt:
Cela vous permettra de spécifier un Hamcrest comparateur de match contre vos attributs comme:
Assurez-vous d'avoir la Hamcrest bibliothèque dans votre classpath et de l'importer comme:
Remarque: Pour importer est particulièrement important si vous utilisez Groovy pour vos tests (Spock) que les noms de méthode dans Hamcrest conflit avec le Groovy de la bibliothèque standard
andExpect(model().attribute("person", hadProperty("emailInfo", hasProperty("email", is("[email protected]"))));
OriginalL'auteur Adrian Lopez