Y a-t-il un Quelque chose comme p> final CapturedContainer<SimpleMailMessage>capturedArgumentContainer = new ...
context.checking(new Expectations() {{
oneOf(emailService.getJavaMailSender()).send(
with(captureTo(capturedArgumentContainer)));
}});
assertEquals("helloWorld", capturedArgumentContainer.getItem().getBody());
3 Réponses :
Je pense que vous manquez le point un peu ici. L'idée est de spécifier dans l'attente em> ce qui devrait se produire, plutôt que de la capturer et de vérifier plus tard. Cela ressemblerait à: ou peut-être, pour une condition de lâche, p>
Vous avez raison en général. Mais parfois, il est de compliquer (et de produire un code très illisible). Par exemple, dans le cas de mon exemple: l'argument est un objet complexe et je n'ai besoin de vérifier qu'un seul attribut (corps). Donc, le code deviendra une masse.
J'accepte votre réponse parce que je comprends votre réponse de cette façon: il n'y a pas de moyen standard de capturer des arguments, car ce n'est pas la façon dont il devrait fonctionner.
En fait, la vérification d'un attribut d'un objet est assez facile. oneof (ewailervice) .Send (avec (HASPROPERTY ("FOO", EGALTO ("BAR")));
Je suis en désaccord: Si votre méthode testée crée un objet, l'utilise en deux appels et le renvoie, vous voudrez peut-être vérifier que l'objet utilisé dans les deux appels et que les retours d'objet sont tous identiques. Pour cela, je ne vois pas d'une autre manière que de pouvoir capturer l'objet.
C'est vrai, mais me fait m'interroger sur la conception. Un exemple concret serait vraiment pratique à propos de maintenant ...
Vous pouvez le faire en implémentant un nouveau matcheur qui capture l'argument lorsque le match est appelé. Cela peut être récupéré ultérieurement.
final CapturingMatcher<ComplexObject> captureMatcher = new CapturingMatcher<ComplexObject>(Expectations.any(ComplexObject.class)); mockery.checking(new Expectations() {{ one(complexObjectUser).registerComplexity(with(captureMatcher)); }}); service.setComplexUser(complexObjectUser); ComplexObject co = (ComplexObject)captureMatcher.getCapturedArgument(); co.goGo();
Je me suis retrouvé dans une situation similaire souhaitant vérifier un champ d'un objet passé dans une simule. Au lieu d'utiliser un matcheur de capture à mesure que Mark illustre, j'ai essayé ce que je considère comme la manière de faire des choses de JMOCK. Code ajusté pour votre cas d'utilisation:
mockery.checking(new Expectations() {{ oneOf(emailService.getJavaMailSender()).send( with(Matchers.<SimpleMailMessage>hasProperty("body", equal("Hello world!")))); }});
Y a-t-il un moyen (suivant ce style) pour tester plusieurs propriétés?