J'ai la classe ci-dessous Il y a une réponse à cela dans StackOverflow mais il s'agit de List lever les exceptions vérifiées des mocks avec Mockito . J'aime examiner cette condition. Ne pas arriver là où je manque.
public SimpleClass{
private SimpleClass(){}
public void runMethod(request,String,Map,Object,Object){
try{
doesSomething()....
}
}
catch(Exception e){
String message= ""+request.getAttribute(X)+"Some message"
Logger.Log(param1+param2+message);
}
}
Ma méthode de test ressemble à ci-dessous. J'essaie d'exécuter la couverture avec la JUnit mais le bloc de capture n'est pas couvert, alors j'ai écrit la méthode de test ci-dessous. Il lève l'exception ci-dessous. Pas en mesure d'arriver là où je manque.
public class SimpleClassTest{
@Test
public void testCatchBlock(){
SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class);
Mockito.doThrow(new Exception()).when(instanceObj).runMethod(request, anyString(), anyMap(), anyObject(), anyObject());
}
}
Exception levée
org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
Invalid: Java.lang.Exception
Modifier
Je peux exécuter la méthode en donnant NullPointerException. Lorsque j'essaie de couvrir le code avec Junit, le bloc catch est complètement affiché en rouge et la phrase catch est affichée en jaune. Comment obtenir une couverture à 100% et comment tester le message String dans le bloc catch.
Vous obtenez des tests unitaires avec des moqueries erronées. Ici:
SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class);
Il y a non point de se moquer de la classe qui est sous test !
Lorsque vous simulez cette classe, vous obtenez un stub qui n'a "rien à voir "avec votre véritable implémentation. Une "configuration de travail" ressemblerait davantage à:
public void methodUnderTest(X x, ...) {
try {
x.foo();
} catch (Exception e) {
...
}
et
X mockedX = mock(X.class);
when(x.foo()).thenThrow(new WhateverException());
underTest.methodUnderTest(mockedX); ...
et ensuite vous pourriez essayer de vérifier par exemple que l'enregistreur a vu cet appel de journalisation attendu. En d'autres termes: vous utilisez soit une maquette pour autoriser votre code sous test à faire son travail (avec vous étant en contrôle!) ou pour vérifier qu'un appel attendu a eu lieu sur un objet factice.
Mais comme dit: cela n'a aucun sens de se moquer de cette classe que vous voulez tester. Parce qu'un objet moqué ne sait rien de la "vraie" implémentation!
Manipulez l'environnement de sorte que le "doesSomething ()" lève l'exception que vous souhaitez. Puisque nous ne savons pas ce que "doesSomething ()" fait vraiment on ne peut pas en dire plus.