Обнаружен ошибочный аргумент аргументов. Вы не можете использовать аргументы аргументов вне проверки или stubbing в Mockito

Из следующих двух тестовых примеров в BundleProcessorTest.java я получаю ниже исключения, хотя мой первый тестовый пример успешно проходит.

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Обнаружен ошибочный аргумент аргументов:

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

Вы не можете использовать аргументы аргументов вне проверки или stubbing. Примеры правильного использования аргументов:     когда (mock.get(anyInt())) thenReturn (нуль).     doThrow (новое RuntimeException()). когда (mock).someVoidMethod(anyObject());     проверить (макет).someMethod(содержит ( "Foo" ))

Кроме того, эта ошибка может появиться, потому что вы используете аргументы соответствия с методы, которые нельзя издеваться. Следующие методы не могут быть stubbed/verified: final/private/equals()/hashCode().

в bundle.test.BundleProcessorTest.bundlePluginCollectionShouldNotBeNull(BundleProcessorTest.java:28)   at 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:

Но если я отмечаю тест bundlePluginCollectionShouldNotBeNull с аннотацией @Ignore, тогда первый тестовый пример проходит без каких-либо исключений.

Ответ 1

Вы используете mockito anyString() при вызове метода тестирования, его следует использовать только для проверки макетного объекта, чтобы гарантировать, что какой-либо метод вызывается с любым строковым параметром внутри теста, но не для вызова самого теста. Для вашего теста используйте пустую строку "" вместо anyString().

Ответ 2

В идеале anyString() не следует использовать вне блока mock или verify. Я столкнулся с той же проблемой. Изменение значения anyString() для некоторой строки ("xyz") работает нормально.

Примечание: Обратите внимание, что вы можете использовать anyString() для некоторых других методов, что приводит к сбою некоторых других методов. Это потратило мой час, чтобы понять это. Мой настоящий тестовый метод получал проходы по отдельности, но когда я пытался запустить его в отверстии, он получал сбой из-за причины, по которой какой-то другой тестовый случай использовал anyString() снаружи для проверки или проверки блока.