Метод из основного класса вызывается для Mockito

#java #mocking #powermockito

#java #издевательство #powermockito

Вопрос:

Я пишу тестовый класс для одного из методов в моем классе. Я не могу внести большие изменения в класс. Ниже приведена более простая версия моего кода.

 Class AInternal extend A {
    public List getList(listArg1, listArg2)  {
        boolean flag = isCorrectFlag();
        if (flag)  {
            return getListForNext(nextArg1, nextArg2);
        }
    }

    public boolean isCorrectFlag(){
        //logic and return value
    }

    protected List getListForNext(nextArg1, nextArg2)   {
        AIteror arit = new AIterator();
        String s  = fetchValue();
        arit.getObject();
    }

    protected class AIterator  {
        public Iterator getObject() {
            //logic and return iterator
        }
    }

}

Class A {
    public  String fetchValue() {
        //logic and return value
    }
}
  

Ниже приведен мой метод тестирования

 @Test
public void getList() throws Exception {
    try {
      AInternal AInternalSpy = spy(new AInternal());
      AIterator AIteratorSpy = spy(AInternal.new AIterator());
      Iterator<Object> iterator1 = ep.iterator();
      doReturn(Boolean.TRUE).when(AInternalSpy).isCorrectFlag();
      doReturn("value").when(AInternalSpy).fetchValue();
      doReturn(iterator1).when(AIterator).getObject();
      
      AInternalSpy.getIteratorPartitions(arg1, arg2);

    }
    catch (IllegalArgumentException e) {
      throw new Exception(e);
    }
  }
  

Первые два doReturn возвращают правильные значения, но метод GetObject() вызывает метод из класса и не возвращает заглушенное значение.
Я попытался вернуть макет экземпляра с помощью PowerMockito.whenNew, но это не сработало.
Любые указатели будут полезны.

Комментарии:

1. вы не можете так издеваться. Если вы хотите издеваться над ним, сделайте этот сервис полем в классе, а не локальным в методе, где вы его инициализируете

2. @Stultuske почему первые два корректно возвращают заглушенные значения?

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

Ответ №1:

Вы могли бы переместить создание нового экземпляра в новую функцию, подобную этой:

 protected AIterator getIteratorInstance() {
    return new AIterator();
}
  

Теперь вы можете изменить функцию getListForNext(…), чтобы:

 protected List getListForNext(nextArg1, nextArg2)   {
    AIteror arit = getIteratorInstance();
    String s  = fetchValue();
    arit.getObject();
}
  

Теперь верните макет или шпион AIterator для вновь созданной функции getIteratorInstance():

 doReturn(AIteratorSpy).when(AInternalSpy).getIteratorInstance()
  

Ваш тест должен выполняться сейчас.