Не удается вернуть значение при использовании следующих методов Mockito.when(), PowerMockito.when(), Mockito.doReturn()

Ниже приведены мои классы

У меня есть интерфейс со следующим методом.

Интерфейс выглядит следующим образом и имеет один из методов

public interface SimpleDocumentManager{

    public List getUserDocIdOfRelatedDocumentsForTemplate(String docType, List<String> templateNames,ZoneCriteria mainZoneCriteria,List<ZoneCriteria> detailZoneCriteria);
    }

Примечание. ZoneCrieria — это класс POJO.

У меня есть абстрактный суперкласс и в нем есть метод инициализации, у меня также есть подкласс, который расширяет суперкласс и переопределяет метод инициализации, а в методе инициализации подкласса я вызываю соответствующий метод службы. Код для следующих классов выглядит следующим образом.

public abstract class Superclass{
    public void init( ){

    }
}

public class Subclass extends Superclass 
{       
     public void init(){

          List<Map<String, Object>> ordersList =  getSimpleDocumentManager().getUserDocIdOfRelatedDocumentsForTemplate(OrderConstants.TYPE_NAME, Arrays.asList(getOriginalTemplateName()), getCriteriaMap(primaryRow), Collections.emptyList());
     }      
}

В приведенном выше методе для получения ZoneCriteria я написал частный метод в подклассе.

private ZoneCriteria  getCriteriaMap(){
    Some logic that returns the ZoneCriteria.
}

Вышеупомянутый метод используется как один из параметров, который возвращает ZoneCriteria, когда я вызываю метод, присутствующий в SimpleDocumentManager.

А вот мой тестовый пример для подкласса

@RunWith(PowerMockRunner.class)
@PrepareForTest({ServiceLocatorBeanFactory.class})

public class TestClass {

    @Before
    public void initialize(){
        PowerMockito.mockStatic(ServiceLocatorBeanFactory.class);
        PowerMockito.mockStatic(BusinessRulesUtil.class);
    }


    @Test
    public void testSubclass(){

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("ID, "POR0000001");
        List<Map<String, Object>> asList = Arrays.asList(map);

        SimpleDocumentManager simpleDocumentManager = Mockito.mock(SimpleDocumentManager.class);
        PowerMockito.when(ServiceLocatorBeanFactory.getService(SimpleDocumentManager.class)).thenReturn(simpleDocumentManager);

        PowerMockito.when(simpleDocumentManager.getUserDocIdOfRelatedDocumentsForTemplate(Mockito.anyString(),Mockito.anyList(),Mockito.any(ZoneCriteria.class),Mockito.anyList())).thenReturn(asList);

        Mockito.when(simpleDocumentManager.getUserDocIdOfRelatedDocumentsForTemplate(Mockito.anyString(),Mockito.anyList(),Mockito.any(ZoneCriteria.class),Mockito.anyList())).thenReturn(asList);

        Mockito.doReturn(asList).when(simpleDocumentManager).getUserDocIdOfRelatedDocumentsForTemplate(Mockito.anyString(),Mockito.anyList(),Mockito.any(ZoneCriteria.class),Mockito.anyList());


        Subclass subclass = new Subclass();
        subclass.init();
        subclass = Mockito.spy(subclass);
        subclass .init();

    }

Я использовал три способа вернуть значение при вызове метода в SimpleDocumentManager. Ниже приведены три способа

1.PowerMockito.when(simpleDocumentManager.getUserDocIdOfRelatedDocumentsForTemplate(Mockito.anyString(),Mockito.anyList(),Mockito.any(ZoneCriteria.class),Mockito.anyList())).thenReturn(asList);

2.Mockito.when(simpleDocumentManager.getUserDocIdOfRelatedDocumentsForTemplate(Mockito.anyString(),Mockito.anyList(),Mockito.any(ZoneCriteria.class),Mockito.anyList())).thenReturn(asList);

3.Mockito.doReturn(asList).when(simpleDocumentManager).getUserDocIdOfRelatedDocumentsForTemplate(Mockito.anyString(),Mockito.anyList(),Mockito.any(ZoneCriteria.class),Mockito.anyList());

Но ни один из вызовов не возвращает мне значение. Когда я отлаживаю код, getSimpleDocumentManager() возвращает издевательский объект, но метод не вызывается.

Также я создал объект подкласса двумя способами. Это выглядит следующим образом

1. Directly instantiated the Subclass in test method as follows

    Subclass subclass = new Subclass();
    subclass.init();

2.Did a spy of the instantiated Subclass

    Subclass subclass = new Subclass();
    subclass = Mockito.spy(subclass );
    subclass .init();

Когда метод getSimpleDocumentManager().getUserDocIdOfRelatedDocumentsForTemplate(OrderConstants.TYPE_NAME, Arrays.asList(getOriginalTemplateName()), getCriteriaMap(primaryRow), Collections.emptyList())

называется я хочу вернуть "List<Map<String, Object>>" так что для этого я делаю это

Map<String, Object> map = new HashMap<String, Object>();
map.put("USER_DOC_ID", "POR0000001");
List<Map<String, Object>> asList = Arrays.asList(map);

и я возвращаю asList в thenReturn() следующим образом thenReturn(asList);

при подготовке ZoneCriteria я проверяю значение, и если это значение отсутствует, у меня возникает исключение UserDefined Exception.

Поэтому, когда я выполняю свой тестовый пример, я получаю это исключение проверки, вместо этого он должен возвращать список, который я подготовил.

Я просмотрел разные ссылки в переполнении стека и не смог получить ответ. Ниже приведены ссылки. Link1

Ссылка2

Link3

Пожалуйста помоги


person Avinash Reddy    schedule 27.01.2016    source источник
comment
Также я издевался над картой и списком следующим образом Map‹String, Object› map = Mockito.mock(HashMap.class); map.put(RuntimeDocumentConstants.USER_DOC_ID, POR0000001); Список‹Карта‹Строка, Объект›› asList = Mockito.mock(ArrayList.class);   -  person Avinash Reddy    schedule 27.01.2016
comment
Здесь происходит много всего, но одна непосредственная проблема, которую я вижу, заключается в том, что не похоже, что вы настраиваете вызов статического метода ServiceLocatorBeanFactory.getService() для правильной имитации. Обратитесь к документации по фиктивному статическому методу.   -  person ach    schedule 27.01.2016
comment
@ach - у меня уже есть этот код в моем тестовом классе, издеваясь над ServiceLocatorBeanFactory, я пропустил добавление этого кода здесь. Теперь я добавил то же самое в тестовом классе. Несмотря на то, что я издеваюсь над ServiceLocatorBeanFacotry, используя PowerMockito, который является статическим классом, я все еще сталкиваюсь с этой проблемой.   -  person Avinash Reddy    schedule 28.01.2016
comment
@AvinashReddy, не могли бы вы опубликовать утверждение утверждения, которое вы используете?   -  person Lencalot    schedule 29.01.2016
comment
@AvinashReddy Думаю, я вижу проблему. Можете ли вы опубликовать код и/или класс, содержащий метод getSimpleDocumentManager().   -  person Lencalot    schedule 29.01.2016
comment
@Lencalot Думаю, я понял проблему. Метод getSimpleDocumentManager().getUserDocIdOfRelatedDocumentsForTemplate(OrderConstants.TYPE_NAME, Arrays.asList(getOriginalTemplateName()), getCriteriaMap(primaryRow), Collections.emptyList()); внутренне имеет вызов другого метода с именем getCriteriaMap(primaryRow), этот метод имеет ошибку проверки, когда он не находит значение. Я не передавал это ожидаемое значение для метода. После того, как значение было передано. Мой метод, над которым издевались или заглушали, начал работать   -  person Avinash Reddy    schedule 03.02.2016
comment
Рад, что это сработало для вас.   -  person Lencalot    schedule 04.02.2016