Mockito: Invalideuseofmatchersexception

J'ai un outil de ligne de commande qui effectue une vérification DNS. Si la vérification DNS réussit, la commande continue avec 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(String hostname, InetAddressFactory factory) {
        // calls to verify hostname
    }
}

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

public class InetAddressFactory {
    public InetAddress getByName(String 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 (i.e. after dnsCheck)
    @Test
    void testPostDnsCheck() {
        final Cmd cmd = spy(new Cmd());

        // this line does not work, and it throws the exception below:
        // tried using (InetAddressFactory) anyObject()
        doNothing().when(cmd).dnsCheck(HOST, any(InetAddressFactory.class));
        cmd.runCommand();
    }
}

Exception lors de 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 String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

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

90
demandé sur jSepia 2013-02-13 06:56:22

4 réponses

Le message d'erreur décrit la solution assez clairement. 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 matcher. Une version correcte peut lire

doNothing().when(cmd).dnsCheck(eq(HOST), any(InetAddressFactory.class))
186
répondu Ryan Stewart 2013-02-13 03:03:31

J'ai eu le même problème depuis longtemps, j'avais souvent besoin de mélanger les Matchers et les valeurs et je n'ai jamais réussi à le faire avec Mockito.... jusqu'à récemment ! J'ai mis la solution ici en espérant que cela aidera quelqu'un, même si ce post est assez ancien.

Il n'est clairement pas possible d'utiliser des Matchers et des valeurs ensemble dans Mockito, mais que se passe-t-il s'il y avait un Matcher acceptant de comparer une variable ? Qui permettrait de résoudre 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

22
répondu sam 2016-10-11 22:10:18

Cela pourrait aider quelqu'un dans le futur: Mockito ne supporte pas la moquerie des méthodes 'finales' (en ce moment). Il m'a donné le 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 substituable.

Passez en revue l'API Mockito pour votre cas d'utilisation.

7
répondu delucasvb 2017-01-26 13:40:18

Malgré l'utilisation de tous les matchers, j'obtenais 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 j'essayais de me moquer était une méthode statique d'une classe(disons Xyz.classe) qui ne contient que la méthode statique et j'ai oublié d'écrire la ligne suivante:

PowerMockito.mockStatic(Xyz.class);

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

0
répondu S Kumar 2018-06-22 09:07:14