web-dev-qa-db-fra.com

Comment simuler/tester une méthode qui retourne void, éventuellement dans Mockito

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?

17
Jarek

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();
31
hoipolloi
doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {

            return null;
        }
    }).when(mock).method((SomeClass) anyObject());
21
Marcin Michalski

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.

10
Sourabh

Vous pouvez aussi utiliser:

  • La méthode Mockito.verify (mock/spy) pour vérifier combien de fois la méthode a été appelée.
  • Ou utilisez le argument captor pour voir/vérifier certains paramètres transmis à la méthode void.
1
jakcam

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.

0
Tim B

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(); 
0