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



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

org.mockito.exceptions.missing.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"))

此外,此错误可能会出现,因为您使用的参数匹配器无法模仿的方法。以下方法不能stupped/verified: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测试,那么第一个测试用例会毫无异常地通过。

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

理想情况下,anyString()不应在mock或verify块之外使用。我也面临同样的问题。将anyString()更改为某个字符串("xyz")值效果良好。

注意:请注意,您可能会将anyString()用于某些其他方法,从而导致某些其他方法失败。我花了一个小时才弄明白。我实际的测试方法是单独通过,但当我试图在洞里运行时,它失败了,因为其他一些测试用例在外面使用anyString()来模拟或验证块。

我们需要在项目的src/test/resources/mockito扩展目录中添加一个名为org.mockito.plugins.LockMaker的文本文件,并添加一行文本:

模拟制造商内联

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

如果您正在使用@Mock并收到相同的错误,可能是由于mock无法正常工作。对我来说,在setup()中添加MockitoAnnotations.initMocks(this);解决了这个错误。

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

相关内容

  • 没有找到相关文章

最新更新