確かに、JMockit を使用してからしばらく経ちましたが、この種の難しさは覚えていません。非常に単純なコードの非常に単純なテストがあります。しかし、returns = List を設定しても、モックされたメソッドは String だけを返し続けます! テストは次のとおりです。
public class ResponseWrapperTest {
@Mocked
UriInfo uri;
@Mocked // I've also tried @Injectable
MultivaluedMap<String,String> queryParams;
@Test
public void ResponseWrapper() throws JSONException {
final List<String> arSkip = new ArrayList<String>(Arrays.asList("0"));
new Expectations() {{
uri.getQueryParameters(); result = queryParams;
queryParams.get("skip"); result = arSkip;
}};
ResponseWrapper wrapper = new ResponseWrapper(uri);
}
そして、これがテストしているコードです:
ResponseWrapper(UriInfo uriInfo) {
MultivaluedMap<String,String> params = uriInfo.getQueryParameters();
String skip = getParam(params, "skip");
}
private String getParam(MultivaluedMap<String,String> params, String name) {
String result = null;
List<String> list = params.get(name); // <== Cast exception occurs here
if (list != null) {
result = list.get(0);
}
return result;
}
「params」は Map ではなく、MultivaluedMap であることに注意してください。そのため、params.get() は List を返すことが期待されます。ご覧のとおり、リストへの戻りを設定していますが、コード内のモックされた get() は含まれている文字列のみを返し、これによりキャスト例外が発生します。
私も return(...) を使ってみました。別の手順でarSkipを作成し、それを最終的なものとして定義しようとしました。何も機能しません。
JMockit が私のリストを順次応答として解釈しているのではないかと疑っていますが、型がメソッドの戻り値の型と一致することを確認する必要があります。ここで何が起こっているのですか?