web-dev-qa-db-fra.com

Matcher d'argument déplacé détecté ici. Vous ne pouvez pas utiliser les comparateurs d'arguments en dehors de la vérification ou du stubbing dans Mockito

Sur les deux cas de test suivants dans BundleProcessorTest.Java, je suis en dessous de l'exception, bien que mon premier cas de test réussisse.

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: correspondance d'arguments mal placée détectée ici:

-> à bundle.test.BundleProcessorTest.bundlePluginShouldNotBeNull (BundleProcessorTest.Java:22)

Vous ne pouvez pas utiliser des comparateurs d'arguments en dehors de la vérification ou du stubbing. Exemples d'utilisation correcte des comparateurs d'arguments: when (mock.get (anyInt ())). ThenReturn (null); doThrow (new RuntimeException ()). when (mock) .someVoidMethod (anyObject ()); vérifier (maquette) .someMethod (contient ("foo"))

En outre, cette erreur peut apparaître car vous utilisez des comparateurs d'arguments avec des méthodes qui ne peuvent pas être moquées. Les méthodes suivantes ne peuvent pas être tronquées/vérifiées: final/private/equals ()/hashCode ().

à bundle.test.BundleProcessorTest.bundlePluginCollectionShouldNotBeNull (BundleProcessorTest.Java:28) à Sun.reflect.NativeMethodAccessorImpl.invoke0 (méthode native) à Sun.reflect.NativeMethodAccessorImpl.invoke (source inconnue)

Veuillez trouver ci-dessous la liste des codes simplifiés: -

BundlePlugin.Java

package bundle;

import Java.util.List;

public class BundlePlugin {

    private final String pluginName ;
    private final List<String> featureContent ;

    public BundlePlugin(String pluginName, List<String> featureContent) {
        super();
        this.pluginName = pluginName;
        this.featureContent = featureContent;
    }

    public String getPluginName() {
        return pluginName;
    }

    public List<String> getFeatureContent() {
        return featureContent;
    }
}

BundleProcessor.Java

package bundle;

import Java.util.ArrayList;
import Java.util.Iterator;
import Java.util.List;

public class BundleProcessor {

    public BundlePlugin getBundlePlugin(String pluginName, Iterator<String> artifactIterator) {

        List<String> featureContent = new ArrayList<String>() ;

        return new BundlePlugin(pluginName, featureContent);
    }
}

BundleProcessorTest.Java

package bundle.test;

import static org.junit.Assert.assertNotNull;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;

import Java.util.Iterator;
import Java.util.List;

import org.junit.Test;

import bundle.BundleProcessor;

public class BundleProcessorTest {

    BundleProcessor bundleProcessor = new BundleProcessor() ;   

    @Test
    public void bundlePluginShouldNotBeNull() {

        Iterator<String> artifactIterator = mock(Iterator.class) ;
        bundle.BundlePlugin bundlePlugin = bundleProcessor.getBundlePlugin(anyString(), artifactIterator) ;
        assertNotNull( bundlePlugin );
    }

    @Test
    public void bundlePluginContentShouldNotBeNull() {
        Iterator<String> artifactIterator = mock(Iterator.class) ;
        bundle.BundlePlugin bundlePlugin = bundleProcessor.getBundlePlugin(anyString(), artifactIterator) ;

        List<String> featureContent = bundlePlugin.getFeatureContent() ;
        assertNotNull( featureContent );
    }
}

Comment exécuter ce test sans problème.


Modifier 1:

Mais si je marque le test bundlePluginCollectionShouldNotBeNull avec l'annotation @Ignore, le premier cas de test réussit sans aucune exception.

24
mogli

Vous utilisez mockito anyString() lors de l'appel de la méthode de test, elle ne doit être utilisée que pour vérifier un objet fictif afin de garantir qu'une certaine méthode est appelée avec n'importe quel paramètre de chaîne à l'intérieur du test, mais pas pour invoquer le test lui-même. Pour votre test, utilisez une chaîne vide "" À la place de anyString().

39
Zahid M

Idéalement, anyString () ne doit pas être utilisé en dehors de la maquette ou du bloc de vérification. J'étais confronté au même problème. La modification de la valeur anyString () en une chaîne ("xyz") fonctionne correctement.

Remarque: Notez que vous pourriez utiliser anyString () à d'autres méthodes qui conduisent à l'échec d'une autre méthode. J'ai perdu une heure pour le comprendre. Ma méthode de test réelle obtenait des passes individuellement, mais lorsque j'essayais de l'exécuter dans un trou, elle échouait en raison de la raison pour laquelle un autre scénario de test utilisait anyString () à l'extérieur pour se moquer ou vérifier le bloc.

0
AshutoshKumar