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
而不会得到List
和List
。 由于集合的使用非常频繁,尝试使用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; }
其余只是几个地图和吸气剂和制定者。