6 votes

PowerMockito : obtention d'une exception InvalidUseOfMatchersException lors de l'utilisation de la méthode statique de mocking matchers

Quand je teste cette méthode statique

public class SomeClass {
    public static long someMethod(Map map, String string, Long l, Log log) {
        ...
    }
}

avec

import org.apache.commons.logging.Log;

@RunWith(PowerMockRunner.class)
//@PrepareForTest(SomeClass.class)
public class Tests {
    @Test
    public void test() {
        ...
        PowerMockito.mockStatic(SomeClass.class);
        Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), isA(Log.class))).thenReturn(1L);
        ...
    }
}

J'ai InvalidUseOfMatchersException . Mes questions sont les suivantes :

  1. Pourquoi ai-je obtenu cette exception alors que tous les arguments utilisent des matchers ? Comment la résoudre ? Je l'ai débogué, j'ai trouvé le isA(Log.class) renvoie un résultat nul.
  2. Lorsque j'ajoute le @PrepareForTest à la classe de test et exécuter le test, le junit ne répond pas. Pourquoi ?

EDIT

J'ai essayé de ne pas utiliser les comparateurs d'arguments, et j'ai obtenu

org.mockito.exceptions.misusing.MissingMethodInvocationException : when() requiert un argument qui doit être 'un appel de méthode sur un mock'. Par exemple when(mock.getArticles()).thenReturn(articles) ;

De plus, cette erreur peut apparaître parce que :

  1. vous bloquez l'une des méthodes suivantes : final/private/equals()/hashCode(). Ces méthodes ne peut pas être stubé/vérifié.

  2. dans when() vous n'appelez pas la méthode sur mock mais sur un autre objet.

à ...

Il semble donc qu'en raison de la someMethod même. Il existe synchronisé dans la méthode. Je me demande si Powermockito peut simuler ce genre de méthode ou non.

2voto

Brad Points 4963

Essayez de remplacer l'appel isA() par un autre appel any() comme ceci

Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), any(Log.class))).thenReturn(1L);

[EDIT]

Vérifiez votre stacktrace lorsque vous obtenez l'exception. Voyez-vous des NoClassDefFoundError rapporté ? J'ai remarqué que lorsque je n'avais pas inclus les javassist.jar Dans mon projet, j'ai obtenu une erreur similaire à la vôtre.

J'utilise PowerMockito et voici les jars que j'ai ajoutés à un tout nouveau projet pour exécuter le code que @Tom a posté.

  • powermock-mockito-1.4.10-full.jar
  • mockito-all-1.8.5.jar
  • javassist-3.15.0-GA.jar
  • junit-4.8.2.jar
  • common-logging-1.1.1.jar

Il est toujours bon de vérifier que vous utilisez des versions de JAR compatibles, et de vérifier également s'il y a d'autres JAR en conflit dans le classpath de vos projets.

1voto

Mieux vaut tard que jamais, la ligne ci-dessous :

Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(),
    isA(Log.class))).thenReturn(1L);

devrait être :

PowerMockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(),
    isA(Log.class))).thenReturn(1L);

Ainsi, au lieu d'invoquer Mockito.when il faut invoquer PowerMockito.when

0voto

Tom Tresansky Points 5423
  1. isA retournera toujours null . C'est à dessein, c'est documenté dans la Javadoc de la méthode isA(). La raison en est que null correspondra toujours au type de retour paramétré de la classe, qui correspondra toujours au type de l'argument dans la méthode stubbed pour laquelle le Matcher isA() est utilisé. La valeur nulle qui est renvoyée n'est pas réellement prise en compte.

  2. Cela semble bien fonctionner pour moi. Mon cas de test complet :

    import static org.mockito.Matchers.*;

    import java.util.Map;

    import org.apache.commons.logging.Log; import org.apache.commons.logging.impl.SimpleLog; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner;

    class SomeClass { public static long someMethod(final Map map, final String string, final Long l, final Log log) { return 2L; } }

    @RunWith(PowerMockRunner.class) @PrepareForTest(SomeClass.class) public class InvalidUseOfMatchersTest { @Test public void test() { // Mock the SomeClass' static methods, stub someMethod() to return 1 PowerMockito.mockStatic(SomeClass.class); Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), isA(Log.class))).thenReturn(1L);

        // null NOT is-a Log, uses default stubbing: returns 0
        System.out.println(SomeClass.someMethod(null, null, 5L, null));
        // SimpleLog passes is-a test, uses stubbed result: returns 1
        System.out.println(SomeClass.someMethod(null, null, 7L, new SimpleLog("simplelog")));
    }

    }

Vous pourriez peut-être poster un exemple complet pour aider à diagnostiquer ce qui se passe ?

-1voto

om39a Points 646
<dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>${mockito.version}</version>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>${powermock.version}</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>${powermock.version}</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>

J'espère que votre projet utilise maven. Essayez d'inclure ces bocaux dans la construction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X