4

が呼び出されたときに PowerMockito がFoos の空の配列リストを返すようにしたいのです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 で可能ですか? もしそうなら、どうすればそれを構築できますか?

編集:

OK、根本的な問題は、テストしようとしているメソッドの結果を取得する必要があることですが、リクエストをモックする必要があり、テストしようとしているメソッドの最後にリストがリクエストに配置されています.

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

このメソッドは、モックされたリクエストからいくつかのパラメータを取得します ( Mockito.mock(HttpServletRequest.class);)。通常、私たちのアプリでは、セッション レベルの変数にデータを配置します。ただし、このメソッドは一度に複数回呼び出され、結果がページに ajax されるため、代わりに各データがリクエストに格納されます。

request.setAttribute("inspectionAjaxDetails", details);

したがって、がモックdetailsされたときに、型付きの ArrayList であるを取得する方法が必要です。request

4

1 に答える 1

2

簡単に言えば、できません。Matt Lachman がコメントで指摘したように、型のジェネリックをキャプチャすることはできないため、 andList<Foo>も取得しないと取得できません。コレクションは非常に頻繁に使用されるため、ほとんどの場合、PowerMock でコレクションをキャプチャしようとするのはお勧めできません。List<Bar>List<AnyOtherType>

私の場合、テストしようとしていたメソッドで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;
}

残りは、いくつかのマップとゲッターとセッターだけでした。

于 2013-10-07T16:08:24.473 に答える