web-dev-qa-db-fra.com

Comment vérifier la méthode factice non appelée avec une combinaison de paramètres à l'aide de Mockito

Comment puis-je vérifier qu'une méthode fictive n'a pas été appelée - avec toute combinaison de paramètres - à l'aide de Mockito?

Par exemple, j'ai un objet - myObject - qui utilise un deuxième objet simulé - myMockedOtherObject - qui a une méthode - someMethodOrOther(String parameter1, String parameter2).

Je souhaite appeler myObject.myMethod() et vérifier que someMethodOrOther() n’est pas appelé - avec n’importe quel combinaison de paramètres.

par exemple.:

myObject.doSomeStuff();

verify(myMockedOtherObject, never()).someMethodOrOther();

Sauf que je ne peux pas le faire, car someMethodOrOther() nécessite la fourniture de paramètres spécifiques.

36
Dan King

Vous pouvez accomplir ce que vous voulez avec les arguments de Mockito:

myObject.doSomeStuff();

verify(myMockedOtherObject, never()).someMethodOrOther(
    Mockito.anyString(),
    Mockito.anyString()
);

Bien sûr, vous pouvez rendre cela un peu moins verbeux avec une importation statique comme celle que vous avez pour verify et never.

68
Matt Lachman

Vous devez utiliser des correspondeurs d'arguments pour faire des choses comme celle-ci. Vous fournissez un correcteur d'arguments correspondant à chaque paramètre de votre méthode, mais vous devez vous assurer que vous en choisissez un qui a le bon type. Tous ceux dont vous aurez probablement besoin sont répertoriés dans http://docs.mockito.googlecode.com/hg/latest/org/mockito/Matchers.html .

Supposons que votre méthode est 

public void myMethod(
    String text, int count, MyClass something, List<MyClass> someList) {
    // ...
}  

Votre déclaration de vérification pourrait ressembler à ceci.

verify(myMock, never()).myMethod(
    anyString(), anyInt(), any(MyClass.class), anyListOf(MyClass.class));

Certains des correspondants dont vous aurez probablement besoin sont - 

  • anyInt(), anyLong(), anyShort(), anyBoolean(), anyByte(), anyChar(), anyFloat(), anyDouble() - Ceux-ci correspondent à la version primitive ou à la version d'objet de chacun de ces types. Dans mon exemple, j'ai utilisé anyInt() pour faire correspondre une int, mais cela correspond également à une Integer.
  • any(XXX.class) - Cela correspond à n'importe quel type d'objet. Dans mon exemple, je l'ai utilisé pour faire correspondre une MyClass.
  • anyString() - C’est une autre façon d’écrire any(String.class)
  • anyListOf(XXX.class), anySetOf(XXX.class), anyMapOf(XXX.class, XXX.class) - Celles-ci permettent de faire correspondre les types de collection génériques standard. Dans mon exemple, j'ai utilisé anyListOf pour faire correspondre le List<MyClass>.

Il y en a une poignée d'autres et je vous recommande vivement de parcourir brièvement le Javadoc. Mais ce sont ceux-là que vous utiliserez le plus probablement avec never()

13
Dawood ibn Kareem

Manière plus claire de présenter la solution

import static org.mockito.Mockito.verify;

import static org.mockito.Mockito.never;

//Testing scenario

verify(mockObject, never()).someMethod(mockParam1, MockParam2);
0
manindra naresh