Se moquant de Réflexion à partir des appels
Je suis en train d'essayer de se moquer un peu de réflexion basée sur des méthodes. Ci-dessous vous pouvez voir les détails,
Classe Sous Test
public class TracerLog {
@AroundInvoke
public Object logCall(InvocationContext context) throws Exception {
Logger logger = new Logger();
String message = "INFO: Invoking method - "
+ context.getMethod().getName() + "() of Class - "
+ context.getMethod().getDeclaringClass();
logger.write(message);
return context.proceed();
}
}
Test
public class TracerLogTest {
@Mock
InvocationContext mockContext;
@Mock
Logger mockLogger;
@InjectMocks
private TracerLog cut = new TracerLog();
@BeforeMethod
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void logCallTest() throws Exception {
when(mockContext.proceed()).thenReturn(true);
when(mockContext.getMethod().getDeclaringClass().getName()).thenReturn("someClass");
cut.logCall(mockContext);
verify(mockContext).proceed();
}
}
ou
@Test
public void logCallTest() throws Exception {
when(mockContext.proceed()).thenReturn(true);
when(mockContext.getMethod().getName()).thenReturn("someMethod");
when(mockContext.getMethod().getDeclaringClass().getName()).thenReturn("someClass");
cut.logCall(mockContext);
verify(mockLogger).write(anyString());
verify(mockContext).proceed();
}
Mais, les tests échouent avec une NullPointerException. Je comprends que je suis en train de faire quelque chose de mal contre les moqueries des concepts, mais je ne comprends pas ce que c'est. Pourriez-vous s'il vous plaît jeter un peu de lumière sur elle et aussi me suggérer comment cette méthode peut être testé?
Grâce.
Comment êtes-vous créer vos objets fantaisie et de votre objet sous test? Vous pouvez poster l'ensemble de votre classe de test, plutôt que de simplement la méthode d'essai? Merci.
J'ai maintenant édité la question d'inclure le code complet.
J'ai maintenant édité la question d'inclure le code complet.
OriginalL'auteur Bala | 2012-01-25
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'une Méthode de l'objet et un objet de Classe. Selon votre commentaire, Mockito ne peut plus se moquer d'une Méthode, de sorte que vous aurez besoin d'un vrai. Je n'ai pas testé, mais je crois que ce serait le travail. Au lieu de:
Vous avez besoin:
Évidemment,
getName()
ne sera pas de retour "someMethod" plus etgetDeclaringClass().getName()
sera de retour le nom de cette classe de test (dans l'exemple), mais bien que vous ne pouvais pas choisir ce qu'ils reviennent, qu'ils reviennent est toujours déterministe, donc vous devriez être en mesure de vérifier tout ce dont vous avez besoin. (Bien sûr, si vous avez besoin d'espionner ou de vérifier qu'un appel a été lancé sur la Méthode de l'objet lui-même, vous êtes toujours bloqué.)J'ai édité ma réponse à montrer comment l'utilisation d'une Méthode de l'objet. Cela devrait répondre aux exemples simples dans votre question, mais il y a encore des limitations.
Merci pour votre suggestion, mais mockContext.getMethod().getDeclaringClass() ne fonctionnera pas dans ce cas.
Pourquoi pas? Une véritable méthode a une classe de déclaration. Vous aurez donc le réel déclarer la classe.
Vous êtes de droite. Il a travaillé. Merci beaucoup 🙂
OriginalL'auteur jhericks
Ouais le problème c'est que
mockContext.getMethod()
va retourner la valeur null. Donc, à chaque fois que vous exécutez cette, puis d'appeler quelque chose sur le résultat (getDeclaringClass() ou getName ()), vous obtiendrez les entrées en phase nationale. Vous voudrez probablement utiliser laRETURNS_DEEP_STUBS
de réponse par défaut, lorsque vous configurez la maquette. Quelque chose commedevrait faire l'affaire.
Oh la peine. Brice est bonne (il est généralement, au sujet de ces choses). Depuis Mockito ne peut pas se moquer de finale de classes, je ne vois pas un moyen de faire ce que l'affiche originale voulait. Désolé.
Eh bien, je suis d'accord avec vous, mais InvocationContext n'est pas une classe finale et il se moque de lui dans mon cas, parce que, je ne veux pas le serveur d'application à l'exécution de mon test. Ne suis-je trompé quelque part?
Je ne faisais que parler de la Méthode de la classe, vous devriez aller avec la réponse de jhericks il y a stackoverflow.com/a/9011651/48136 David, je ne peux manquer une des choses 😉
Bien sûr, sur l'autre main de java.lang.de réfléchir.La méthode ne peut pas être moqué à l'aide de Mockito. C'est là que j'ai besoin d'aide. Pouvez-vous svp me donner quelques idées sur la façon de gérer cela?
OriginalL'auteur Dawood ibn Kareem