此处检测到放错位置的参数匹配器。在 Mockito 中,您不能在验证或存根之外使用参数匹配器

2022-09-01 02:32:15

BundleProcessorTest 中的以下两个测试用例中.java,我得到了以下异常,尽管我的第一个测试用例成功通过。

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Misplaced argument matcher 检测到:

-> at 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()。

at 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 测试,那么第一个测试用例会毫无例外地通过。


答案 1

您在调用测试方法时使用 mockito,它应该仅用于验证 mock 对象,以确保使用测试内的任何字符串参数调用某个方法,而不是调用测试本身。对于测试,请使用空字符串而不是 。anyString()""anyString()


答案 2

理想情况下,不应在模拟或验证块之外使用。我遇到了同样的问题。将 更改为某个字符串 (“xyz”) 值工作正常。anyString()anyString()

注意:请注意,您可能会使用其他一些导致其他方法失败的方法。它浪费了我一个小时来弄清楚它。我的实际测试方法是单独获得通过,但是当我试图在一个洞中运行它时,由于其他一些测试用例在外部用于模拟或验证块的原因,它失败了。anyString()anyString()


推荐