2015-10-28 2 views
2

Я пытаюсь высмеять класс и вернуть разбитый список объектов при вызове метода на издеваемом объекте. Давайте рассмотрим следующий код:Mockito не правильно обрабатывает методы, беря список в качестве аргумента

interface MyRepositry{ 
     public List<MyClass> getMyClassInstances(String str,Long id,List<Integer> statusList); 
} 

Я насмешливо выше метод ivocation следующим образом:

when(myRepository.getMyClassInstances("1234", 200L, stubbedList)).thenReturn(stubbedMyClassInstanceList); 

где

stubbedList 

это список я создаю, вставив два целых числа 1 и 3. В real call также передаю список, который я строю, который имеет целые числа 1 и 3. Точка ot note здесь является объектом stubbedList, а объект списка в реальном вызове отличается, но всегда содержит два целых числа 1 и 3.

stubbedMyClassInstanceList  

- это искомый список экземпляров MyClass.

Однако mockito возвращает пустой список, когда я запускаю тест. Я сделал некоторые отладки, и я думаю, Mockito не в состоянии соответствовать объект списка, который я использую в

 when(..).thenReturn(..) 

вызова и фактического вызова и, следовательно, не найти правильную подпись.

Я не могу использовать

anyList() 

Искателя, как я всегда прохожу список из двух целых чисел (1 и 3).

Я решил проблему с помощью пользовательского

 ArgumentMatcher 

следующим образом:

 class StatusMatcher extends ArgumentMatcher<List> { 
    public boolean matches(Object list) { 
     List statuses = ((List) list); 
     return (statuses.size() == 2 && statuses.contains(1) && statuses.contains(3)); 
    } 
} 

Так что вопрос:

1) Является ли мое предположение о том, почему раскорчевке/не насмешливой правильная работа? 2) и является ли решение, которое я использовал правильно?

+0

Просьба предоставить полный (но простой) рабочий пример, демонстрирующий проблему. – Tunaki

+0

Я не могу предоставить фактический код, поскольку он лицензирован для компании, над которой я работаю. Однако я дал минимальный код. Я могу объяснить больше, если вы не найдете какой-либо из приведенных выше объяснений кода достаточно. –

ответ

4

Mockito естественно использует equals() для сопоставления аргументов. Метод equals() в List<T> указывает, что два списка определены равными, если они содержат одни и те же элементы в том же порядке.

Ваш пользовательский аргумент, который, как вы говорите, работает, не рассматривает порядок.

Возможно, что 1 и 3 находятся в неправильном порядке в List<T>?

+1

Или «Список» - это разные типы. – Tunaki

+0

Мой пользовательский матчи не проверяет порядок, он просто проверяет, содержит ли он правильные элементы или нет. –

+0

Список одинаковых типов, т.е. объекты Arraylist of Integer –

0

Mockito имеет метод эк()

Вы можете попробовать:

import static org.mockito.Matchers.eq; 

..... 

when(myRepository.getMyClassInstances(eq("1234"), eq(200L), eq(stubbedList)).thenReturn(stubbedMyClassInstanceList); 
+0

Я попробовал eq() в списке, но безрезультатно –

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