web-dev-qa-db-ja.com

ここで誤った引数マッチャーが検出されました。 Mockitoで検証またはスタブ以外の引数マッチャーを使用することはできません

BundleProcessorTest.Javaの次の2つのテストケースのうち、最初のテストケースが正常に合格しましたが、例外を下回っています。

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:ここで検出された引数マッチャーの位置が間違っています:

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

検証またはスタブ以外で引数マッチャーを使用することはできません。引数マッチャーの正しい使用例:when(mock.get(anyInt()))。thenReturn(null); doThrow(new RuntimeException())。when(mock).someVoidMethod(anyObject()); verify(mock).someMethod(contains( "foo"))

また、モックできないメソッドで引数マッチャーを使用するため、このエラーが表示される場合があります。以下のメソッドをスタブ/検証することはできません:final/private/equals()/ hashCode()。

bundle.test.BundleProcessorTest.bundlePluginCollectionShouldNotBeNull(BundleProcessorTest.Java:28)at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

以下の簡略化されたコードリストをご覧ください。

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 );
    }
}

このテストを問題なく実行する方法。


編集1:

しかし、@-IgnoreアノテーションでbundlePluginCollectionShouldNotBeNullテストをマークすると、最初のテストケースは例外なく合格します。

24
mogli

テストメソッドの呼び出し中にmockito anyString()を使用しています。これは、テスト内の任意の文字列パラメーターで特定のメソッドが呼び出されることを確認するためにモックオブジェクトを検証するためにのみ使用する必要がありますが、テスト自体は呼び出しません。テストでは、anyString()の代わりに空の文字列""を使用します。

39
Zahid M

理想的には、anyString()をモックまたは検証ブロックの外部で使用しないでください。同じ問題に直面していました。anyString()を何らかの文字列( "xyz")値に変更すると正常に機能します。

注: anyString()を使用して、他のメソッドの失敗につながる可能性のある他のメソッドを使用できることに注意してください。それを理解するために私の1時間を無駄にしました。私の実際のテスト方法は個別にパスを取得していましたが、穴でそれを実行しようとすると、他のテストケースがブロックをモックまたは検証するために外部でanyString()を使用していたため失敗しました。

0
AshutoshKumar