#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()
Ваш тест должен выполняться сейчас.