Конечно, я давно не использовал JMockit, но я не помню такой трудности. У меня есть очень простой тест очень простого кода. Но даже если я установил return = 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.get() вернет список. Как вы видите, я устанавливаю возврат в список, но издевательский get() в коде возвращает только содержащуюся строку, и это вызывает исключение приведения.
Я также пытался использовать return(...). Я попытался сделать arSkip отдельными шагами и определить его как окончательный. Ничего не работает.
Я подозреваю, что JMockit интерпретирует мой список как последовательные ответы, но он должен видеть, что тип соответствует типу возвращаемого значения метода. Что здесь происходит?