1. ホーム
  2. java

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

2022-03-07 07:18:47

質問

以下の2つのテストケースのうち BundleProcessorTest.java 最初のテストケースは成功しましたが、次の例外が発生しました。

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: ここで、誤った引数マッチャーが検出されました。

-> at bundle.test.BundleProcessorTest.bundlePluginShouldNotBeNull(BundleProcessorTest.java:22)

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

また、このエラーは、引数マッチャーを使用しているために表示されることがあります。 メソッドをモック化することができません。以下のメソッド できない である stubbed/verified: final/private/equals()/hashCode().

で bundle.test.BundleProcessorTest.bundlePluginCollectionShouldNotBeNull(BundleProcessorTest.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 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を編集します。

しかし bundlePluginCollectionShouldNotBeNull テストに @Ignore アノテーションを付けると、最初のテストケースは例外なくパスします。

解決方法は?

mockitoを使用しています。 anyString() テストメソッドを呼び出す際に、モックオブジェクトを検証するためにのみ使用します。あなたのテストでは、空の文字列 "" の代わりに anyString() .