当前位置: 首页 > 面试题库 >

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

傅朗
2023-03-14
问题内容

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

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)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(未知源)

请在下面找到简化的代码清单:

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
测试标记为测试,则第一个测试用例将毫无例外地通过。


问题答案:

anyString()在调用测试方法时使用了模仿,它仅用于验证模拟对象,以确保使用测试中的任何字符串参数调用某个方法,而不能调用测试本身。为了测试,请使用空字符串""代替anyString()



 类似资料: