Mockito: InvalidUseOfMatchersException

J’ai un outil de ligne de commande qui effectue une vérification DNS. Si la vérification DNS réussit, la commande procède à d’autres tâches. J’essaie d’écrire des tests unitaires pour cela en utilisant Mockito. Voici mon code:

public class Command() { // .... void runCommand() { // .. dnsCheck(hostname, new InetAddressFactory()); // .. // do other stuff after dnsCheck } void dnsCheck(Ssortingng hostname, InetAddressFactory factory) { // calls to verify hostname } } 

J’utilise InetAddressFactory pour simuler une implémentation statique de la classe InetAddress . Voici le code pour l’usine:

 public class InetAddressFactory { public InetAddress getByName(Ssortingng host) throws UnknownHostException { return InetAddress.getByName(host); } } 

Voici mon cas de test unitaire:

 @RunWith(MockitoJUnitRunner.class) public class CmdTest { // many functional tests for dnsCheck // here's the piece of code that is failing // in this test I want to test the rest of the code (ie after dnsCheck) @Test void testPostDnsCheck() { final Cmd cmd = spy(new Cmd()); // this line does not work, and it throws the exception below: // sortinged using (InetAddressFactory) anyObject() doNothing().when(cmd).dnsCheck(HOST, any(InetAddressFactory.class)); cmd.runCommand(); } } 

Exception à l’exécution du test testPostDnsCheck() :

 org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 2 matchers expected, 1 recorded. This exception may occur if matchers are combined with raw values: //incorrect: someMethod(anyObject(), "raw Ssortingng"); When using matchers, all arguments have to be provided by matchers. For example: //correct: someMethod(anyObject(), eq("Ssortingng by matcher")); 

Toute consortingbution sur la façon de résoudre ce problème?

Le message d’erreur décrit clairement la solution. La ligne

 doNothing().when(cmd).dnsCheck(HOST, any(InetAddressFactory.class)) 

utilise une valeur brute et un matcher, lorsqu’il est nécessaire d’utiliser toutes les valeurs brutes ou tous les comparateurs. Une version correcte pourrait lire

 doNothing().when(cmd).dnsCheck(eq(HOST), any(InetAddressFactory.class)) 

J’ai eu le même problème pendant longtemps maintenant, j’avais souvent besoin de mélanger des allumettes et des valeurs et je n’ai jamais réussi à le faire avec Mockito… jusqu’à récemment! Je mets la solution ici en espérant que cela aidera quelqu’un, même si ce post est assez ancien.

Il est clairement impossible d’utiliser les valeurs Matchers AND dans Mockito, mais que se passe-t-il si un Matcher accepte de comparer une variable? Cela résoudrait le problème … et en fait il y a: eq

 when(recommendedAccessor.searchRecommendedHolidaysProduct(eq(metas), any(List.class), any(HotelsBoardBasisType.class), any(Config.class))) .thenReturn(recommendedResults); 

Dans cet exemple, ‘metas’ est une liste de valeurs existante

Cela pourrait aider quelqu’un à l’avenir: Mockito ne supporte pas les méthodes «finales» (en ce moment). Cela m’a donné la même InvalidUseOfMatchersException .

La solution pour moi était de mettre la partie de la méthode qui ne devait pas être «finale» dans une méthode séparée, accessible et remplaçable.

Consultez l’ API Mockito pour votre cas d’utilisation.

En dépit de l’utilisation de tous les matchers, je recevais le même problème:

 "org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 1 matchers expected, 3 recorded:" 

Il m’a fallu peu de temps pour comprendre que la méthode que je tentais de simuler était une méthode statique d’une classe (par exemple Xyz.class) qui ne contenait que des méthodes statiques et j’ai oublié d’écrire la ligne suivante:

 PowerMockito.mockStatic(Xyz.class); 

Peut-être que cela aidera les autres car cela peut aussi être la cause du problème.