Конечно, прошло некоторое время с тех пор, как я использовал JMockit, но я не помню таких трудностей. У меня очень простой тест на очень простой код. Но даже если я устанавливаю return = List, издевавшийся метод возвращает только строку! Вот тест:JMockit mock возвращает строку вместо списка <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;
}
Обратите внимание, что «Титулы» является MultivaluedMap, а не карта. Поэтому ожидается, что params.get() вернет список. Как вы видите, я устанавливаю возврат в список, но издеваемое get() в коде возвращает только содержащуюся String, и это вызывает исключение кастинга.
Я пробовал использовать возврат (...). Я пробовал сделать arSkip в sepearate шаги и определить его как окончательный. Ничего не работает.
Я подозреваю, что JMockit интерпретирует мой список как последовательные ответы, но он должен видеть, что тип соответствует типу возвращаемого метода. Что здесь происходит?
Ну, по крайней мере, это не мое здравомыслие, я думаю. Спасибо за информацию! Кто-нибудь знает, есть ли временное решение? – Didjit
Ну, я бы сказал, вы не должны издеваться над картой в первую очередь. Издевательские «объекты ценности» в целом (включая коллекции и карты) обычно считаются плохой практикой. –
Хорошая точка. И с этой целью я понял, что могу просто создать простую реализацию MultivaluedMap и избежать всей проблемы. Спасибо Рожерио. – Didjit