PowerMockito – 如何使用带有类型列表的whenNew()?

我希望PowerMockito在调用new ArrayList()时返回我的空数组Foo ,但我不知道如何构造语句。 具体来说,我希望new ArrayList()正常创建一个新列表。

 ArrayList fooList = new ArrayList(); 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进入页面,因此每条数据都存储在请求中:

 request.setAttribute("inspectionAjaxDetails", details); 

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

简短的回答是:你做不到。 正如Matt Lachman在评论中指出的那样,你无法捕获一个类型的generics,所以你不能得到List而不会得到ListList 。 由于集合的使用非常频繁,尝试使用PowerMock捕获它们几乎总是一个坏主意。

在我的例子中,我需要在我试图测试的方法中获取一个被模拟的HttpServletRequest作为属性(映射 )的List。 我必须找到一个不同的解决方案。 在我的例子中,它是创建一个非匿名的Answer实现,我可以在方法运行后检索值。 我的Mockito电话看起来像这样:

 RequestAnswer requestAnswer = new RequestAnswer(); Mockito.doAnswer(requestAnswer).when(request).setAttribute(Matchers.anyString(), Matchers.anyObject()); ArrayList details = (ArrayList) requestAnswer.getAttribute("foo"); 

我的RequestAnswer类实现了Answer ,其最重要的方法如下所示:

 @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; } 

其余只是几个地图和吸气剂和制定者。