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

时间:2014-04-24 15:25:33

标签: java unit-testing junit mockito

BundleProcessorTest.java 中的以下两个测试用例中,我遇到异常,但是,我的第一个测试用例成功通过。

  

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:   在这里检测到错位的参数匹配器:

     

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

     

您不能在验证或存根之外使用参数匹配器。   正确使用参数匹配器的示例:       当(mock.get(anyInt()))thenReturn(空)。       doThrow(new RuntimeException())。when(mock).someVoidMethod(anyObject());       验证(模拟).someMethod(含有("富&#34))

     

此外,此错误可能会显示,因为您使用参数匹配器   无法模拟的方法。以下方法不能   stubbed / verified:final / private / equals()/ hashCode()。

     

在   bundle.test.BundleProcessorTest.bundlePluginCollectionShouldNotBeNull(BundleProcessorTest.java:28)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   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 测试,那么第一个测试用例传递没有任何异常。

4 个答案:

答案 0 :(得分:34)

你在调用测试方法时使用的是mockito anyString(),它应该只用于验证模拟对象,以确保在测试中使用任何字符串参数调用某个方法,但不调用测试本身。对于您的测试,请使用空字符串""代替anyString()

答案 1 :(得分:1)

我们需要在项目的 src/test/resources/mockito-extensions 目录下添加一个名为 org.mockito.plugins.MockMaker 的文本文件并添加一行文本:

mock-maker-inline

请参考文章https://www.baeldung.com/mockito-final

答案 2 :(得分:0)

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

注意:请注意,您可能对任何其他方法使用anyString()导致其他方法失败。我花了一个小时才弄清楚。我的实际测试方法是逐个通过,但是当我尝试在一个洞中进行测试时,由于其他一些测试用例在外部使用anyString()来模拟或验证块而失败了。

答案 3 :(得分:0)

简单,应将@Spy注释与@InjectMocks注释一起使用。