java - PowerMockito - 如何将 whenNew() 与类型列表一起使用?

标签 java generics powermock

我希望 PowerMockito 返回我的空数组列表 Foo什么时候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);)。通常在我们的应用程序中,我们将数据放在 session 级变量上。但是由于这个方法被一次调用了几次并且结果被ajax到页面中,所以每条数据都存储在请求中:

request.setAttribute("inspectionAjaxDetails", details);

所以我需要一些方法来获得 details ,这是一个类型化的 ArrayList,当 request被 mock 了。

最佳答案

简短的回答是:你不能。正如 Matt Lachman 在评论中指出的那样,您无法捕获类型的泛型,因此无法获得 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;
}

剩下的只是一些 map 和 getter 和 setter。

关于java - PowerMockito - 如何将 whenNew() 与类型列表一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19104647/

相关文章:

java - jax-ws设置读取wsdl和发送请求的连接超时时间

java - 将 double 转换为字符串时出现错误,提示我无法将字符串转换为 double

java - stub 没有涵盖我在单元测试中的方法

generics - F# 编译错误 : Unexpected type application

java - 如何模拟使用 SLF4J Log4J Logger 的类?

java - 类型错误 : Cannot find function createHTMLDocument in object

generics - 如何限制运算符实现的右侧参数的类型?

C11 _Generic 用法

java - 我如何测试是否抛出了 ClassNotFoundException?

java - 具有最终类系统和静态方法 currentTimeMillis 的 PowerMock