Comment vérifier static void méthode a été appelée avec le pouvoir mockito
Je suis en utilisant le suivant.
Powermock-mockito 1.5.12
Mockito 1.95
junit 4.11
Voici mon utils classe
public void InternalUtils {
public static void sendEmail(String from, String[] to, String msg, String body) {
}
}
est ici essentiel de la classe sous test:
public class InternalService {
public void processOrder(Order order) {
if (order.isSuccessful()) {
InternalUtils.sendEmail(...);
}
}
}
Et voici le test:
@PrepareForTest({InternalUtils.class})
@RunWith(PowerMockRunner.class)
public class InternalService {
public void verifyEmailSend() {
mockStatic(Internalutils.class);
doNothing().when(InternalUtils, "sendEmail", anyString(), any(String.class), anyString(), anyString());
Order order = mock(Order.class);
when(order.isSuccessful()).thenReturn(true);
InternalService is = new InternalService();
verifyStatic(times(1));
is.processOrder(order);
}
}
Le test ci-dessus échoue. Le mode de vérification donné est nul, mais selon le code, si la commande est réussie que le courrier électronique doit être envoyé.
Vous devez vous connecter pour publier un commentaire.
Si vous êtes à la tourner en dérision le comportement (avec quelque chose comme
doNothing()
) il n'y a pas besoin de faire appel àverify*()
. Cela dit, voici mon coup de poignard à la ré-écriture de votre méthode d'essai:Je regroupés en quatre sections pour mieux mettre en évidence ce qui se passe:
1. Les Variables
- Je déclarer toutes les variables d'instance /arguments de méthode /maquette collaborateurs ici. Si c'est quelque chose utilisé dans de multiples tests, pensez à faire une variable d'instance de la classe de test.
2. Se Moquer De Comportement
C'est là que vous définissez le comportement de l'ensemble de vos simulacres. Vous êtes en train de configurer les valeurs de retour et les attentes ici, avant d'exécuter le code en cours de test. En règle générale, si vous définissez la simulation de comportement ici, vous n'avez pas besoin de vérifier le comportement plus tard.
3. Exécuter
Rien de compliqué ici; cela juste débute le code testé. Je tiens à lui donner sa propre section pour y attirer l'attention.
4. Vérifier
C'est lorsque vous appelez la méthode, en commençant par
verify
ouassert
. Après le test, vous vérifiez que les choses que vous voulais avoir lieu effectivement se produire. C'est la plus grosse erreur que je vois avec votre méthode d'essai; vous avez tenté de vérifier l'appel de la méthode avant qu'il ne fut jamais donné une chance de s'exécuter. Après cela, c'est vous jamais précisé qui méthode statique vous voulais vérifier.Notes Complémentaires
C'est surtout une question de préférence personnelle de ma part. Il y a un certain ordre, vous devez faire les choses, mais au sein de chaque groupe il y a un peu de marge de manœuvre. Cela m'aide rapidement séparer ce qui se passe et où.
Je recommande fortement d'aller à travers les exemples sur les sites suivants, car ils sont très robustes et peuvent aider dans la majorité des cas, vous aurez besoin de:
verifyStatic()
appeler deux fois, une fois pour la première méthode (suivi par le premier appel de la méthode) et de nouveau pour la deuxième méthode (suivi par le deuxième appel de méthode). Pour la méthode qui est appelée deux fois, passe dans lestimes(2)
àverifyStatic()
.Tu la réponse ci-dessus est largement acceptée et bien documenté, j'ai trouvé certains de la raison pour poster ma réponse ici :-
Ici, je ne comprends pas pourquoi nous faisons appel InternalUtils.sendEmail nous-mêmes.
Je vais l'expliquer dans mon code pourquoi nous n'avons pas besoin de le faire.
Donc, nous avons moqué de la classe qui est très bien.
Maintenant, permet de voir comment nous avons besoin pour vérifier le sendEmail(/..../) méthode.
Ces deux lignes est où la magie est,
La première ligne indique le PowerMockito cadre qu'il a besoin de vérifier la classe de manière statique se moque. Mais la méthode qu'il faut vérifier ??
La deuxième ligne indique la méthode à il a besoin de vérifier.
C'est le code de ma classe, sendEmail api deux fois.
Comme il est d'appeler deux fois, vous avez juste besoin de changer le vérifier(times(2))... c'est tout.