2015-10-16 4 views
1

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

ответ

1

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

+0

Ну, по крайней мере, это не мое здравомыслие, я думаю. Спасибо за информацию! Кто-нибудь знает, есть ли временное решение? – Didjit

+0

Ну, я бы сказал, вы не должны издеваться над картой в первую очередь. Издевательские «объекты ценности» в целом (включая коллекции и карты) обычно считаются плохой практикой. –

+0

Хорошая точка. И с этой целью я понял, что могу просто создать простую реализацию MultivaluedMap и избежать всей проблемы. Спасибо Рожерио. – Didjit

Смежные вопросы