2013-09-30 1 views
3

Я хочу, чтобы PowerMockito возвращал мой пустой массив-список из Foo s, когда вызывается new ArrayList<Foo>(), но я не уверен, как построить инструкцию. В частности, я хочу, чтобы new ArrayList<AnyOtherType>() создал новый список как обычно.PowerMockito - Как использовать whenNew() с типизированным списком?

ArrayList<Foo> fooList = new ArrayList<Foo>(); 
PowerMockito.whenNew(ArrayList.class).withParameterTypes(Foo.class).thenReturn(fooList); 

^Вот в основном то, что у меня есть, но .withParameterTypes(Foo.class) не позволяет мне следовать с .thenReturn(). Мой единственный вариант: withArguments(firstArgument, additionalArguments).

Возможно ли это с помощью PowerMock, и если да, то как его построить?

EDIT:

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

inspectionAction.viewInspectionDetailsAjax(mapping, form, request, response); 

Этот метод тянет пару параметров из запроса, который Посмешищем (Mockito.mock(HttpServletRequest.class);). Обычно в нашем приложении мы помещаем данные на переменную уровня сеанса. Но так как этот метод вызывается несколько раз сразу и результаты ajax'd на страницу, каждая часть данных хранится в запросе вместо:

request.setAttribute("inspectionAjaxDetails", details); 

Так что мне нужно каким-то образом, чтобы получить details, который является набрал ArrayList, когда request издевается.

+1

Попробуйте '.withNoArguments' вместо' .withParameterTypes'. – Aurand

+0

Как я могу указать только 'ArrayList ' вместо всех новых ArrayLists? –

+0

Это еще одна причина, почему обычно не рекомендуется пытаться издеваться над классами коллекции. Лучше создать коллекцию, которую вы хотите вернуть, и принудить другие методы вернуть этот список. –

ответ

1

Короткий ответ: вы не можете. Как отметил Мэтт Лахман в комментариях, вы не можете захватить дженерики типа, поэтому вы не можете получить List<Foo>, не получая также List<Bar> и List<AnyOtherType>. Поскольку коллекции используются так сильно, почти всегда неплохо пытаться захватить их с помощью PowerMock.

В моем случае мне нужно было получить список, который был посмешен HttpServletRequest как атрибут (сопоставленный <String, Object>) в методе, который я пытался проверить. Мне пришлось найти другое решение. В моем случае это было создание не анонимной реализации Answer, что я мог бы получить значения после того, как был запущен метод. Мой Mockito вызов выглядел следующим образом:

RequestAnswer requestAnswer = new RequestAnswer(); 

Mockito.doAnswer(requestAnswer).when(request).setAttribute(Matchers.anyString(), Matchers.anyObject()); 

ArrayList<Foo> details = (ArrayList<Foo>) requestAnswer.getAttribute("foo"); 

Мой класс RequestAnswer реализует Answer<Object>, и его наиболее важный метод выглядит следующим образом:

@Override 
public Object answer(InvocationOnMock invocation) throws Throwable { 
    Object[] args = invocation.getArguments(); 
    String methodName = invocation.getMethod().getName(); 
    if ("setAttribute".equals(methodName)) { 
     String key = (String) args[0]; 
     Object value = args[1]; 
     attributes.put(key, value); 
    } else if ("getAttribute".equals(methodName)) { 
     String key = (String) args[0]; 
     return attributes.get(key); 
    } else if ("getParameter".equals(methodName)) { 
     String key = (String) args[0]; 
     return parameters.get(key); 
    } 
    return null; 
} 

Остальное было всего пару карт и добытчиками и сеттеров.

 Смежные вопросы

  • Нет связанных вопросов^_^