Je suis tombé sur un problème et je ne trouve pas de solution élégante.
Le problème est donc avec une maquette du pilote Web Selenium, et je ne sais pas comment devrais-je tester/simuler des méthodes vides.
public void clickAndWait(String locator) {
if(isElementPresent(locator) == false) throw some exception;
Selenium.clickAndWait(); //a problematic delegating call to Selenium
}
Donc, ce que je demande, c'est comment bien tester une telle méthode, un test serait d'exception levée, mais comment bien tester cette méthode de vide à laquelle je délègue?
L'exemple de code suivant tiré de cette documentation Mockito illustre comment simuler une méthode void:
doThrow(new RuntimeException()).when(mockedList).clear();
// following throws RuntimeException:
mockedList.clear();
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
return null;
}
}).when(mock).method((SomeClass) anyObject());
Les réponses précédentes insistaient sur le fait de faire quelque chose (en lançant éventuellement une exception) à chaque appel. De cette façon, lorsque vous faites quelque chose comme:
doThrow(new RuntimeException()).when(mockedList).clear();
puis appelez le service (ou la logique) stubbed comme ceci:
mockedList.clear();
cela va générer une exception. Et si vous voulez tester le bon fonctionnement de la méthode, écrivez peut-être un cas de test positif. Se moquer d'une méthode de retour à vide pour un tel cas pourrait être fait par:
doNothing().when(mockedList).clear();
ce qui signifie que puisque vous avez modifié la méthode clear()
pour mockedList
mock, vous pouvez être sûr que cette méthode ne va pas affecter la logique de l'unité et vous pouvez toujours vérifier le reste du flux sans générer d'exception.
Vous pouvez aussi utiliser:
En Java 8, cela peut être rendu un peu plus propre
doAnswer((i) -> {
// Do stuff with i.getArguments() here
return null;
}).when(*mock*).*method*(*methodArguments*);
Le return null;
est important et sans cela, la compilation échouera avec des erreurs assez obscures car il ne sera pas en mesure de trouver un remplacement approprié pour doAnswer
.
Vous pouvez créer une exception sur votre appel de méthode, voici un petit exemple pour le faire:
doThrow(new RuntimeException()).when(mockedList).clear();
alors vous appelez la méthode mockedList.clear();
mocked lève une exception.
Ou vous pouvez compter combien de fois votre méthode a été appelée, voici un petit exemple comment le faire:
verify(mockedList, times(1)).clear();