JMockit mock возвращает String вместо предоставленного List‹String›

Конечно, я давно не использовал 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 интерпретирует мой список как последовательные ответы, но он должен видеть, что тип соответствует типу возвращаемого значения метода. Что здесь происходит?


person Didjit    schedule 16.10.2015    source источник


Ответы (1)


Это регрессия, начинающаяся в JMockit 1.11 (август 2014 г.). Это будет исправлено в версии 1.20 (октябрь 2015 г.).

person Rogério    schedule 17.10.2015
comment
Ну, по крайней мере, это не мой рассудок, я думаю. Спасибо за информацию! Кто-нибудь знает, есть ли обходной путь? - person Didjit; 18.10.2015
comment
Ну, я бы сказал, что вы не должны издеваться над картой в первую очередь. Имитация объектов значений в целом (включая коллекции и карты) обычно считается плохой практикой. - person Rogério; 19.10.2015
comment
Хорошая точка зрения. И с этой целью я понял, что могу просто создать простую реализацию MultivaluedMap и избежать всей проблемы. Спасибо, Роджерио. - person Didjit; 21.10.2015