4

Foo我希望 PowerMockito 在调用时返回我的空数组列表new ArrayList<Foo>(),但我不确定如何构造语句。具体来说,我想像new ArrayList<AnyOtherType>()往常一样创建一个新列表。

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

^ 这基本上是我所拥有的,但.withParameterTypes(Foo.class)不允许我使用.thenReturn(). 我唯一的选择是withArguments(firstArgument, additionalArguments)

PowerMock 可以做到这一点,如果可以,我该如何构建它?

编辑:

好的,根本问题是我需要获取我正在尝试测试的方法的结果,但是我不得不模拟请求,并且列表放在我正在尝试测试的方法末尾的请求中.

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

此方法从请求中提取几个参数,这些参数被模拟 ( Mockito.mock(HttpServletRequest.class);)。通常在我们的应用程序中,我们将数据放在会话级变量上。但是由于这个方法一次被调用了好几次,并且结果被 ajax'd 到了页面中,所以每条数据都被存储在请求中:

request.setAttribute("inspectionAjaxDetails", details);

所以我需要一些方法来获取details,它是一个类型化的 ArrayList,当request被模拟时。

4

1 回答 1

2

简短的回答是:你不能。正如马特拉赫曼在评论中指出的那样,你无法捕获一个类型的泛型,所以你不能没有List<Foo>得到List<Bar>and 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;
}

剩下的只是几个 Maps 和 getter 和 setter。

于 2013-10-07T16:08:24.473 回答