Mockito - аргумент проверки запятой с разделенным запятыми списком без порядка - PullRequest
0 голосов
/ 27 мая 2018

Моя версия Mockito не самая новая -версия 1.10.19

У меня есть метод в классе DAO, который я хочу протестировать, например

public void updateMe(String commaSeparatedAttributes)

Он получает строкув качестве аргумента с разделенным запятыми списком как 2,5,3

Проблема в том, что порядок списка не гарантирован.

Я нашел это решение с HamcrestcontainsInAnyOrder, но это не помогает мне, потому что аргумент является строкой, я пробовал несколько вариантов (включая отправку ArrayList) как:

verify(dao).updateMe(argThat(Matchers.containsInAnyOrder("2","5,"3")));

Это не компилируется с ошибкой:

Type mismatch: cannot convert from Iterable<capture#1-of ? extends String> to String

РЕДАКТИРОВАТЬ

Также следующее возвращение NullPointerException в тесте

verify(dao).updateMe(argThat( 
new ArgumentMatcher<String>() { 
@Override 
public boolean matches(Object argument) { 
List<String> inputs = Arrays.asList(((String)argument).split(",")); 
return inputs.containsAll(Arrays.asList("2", "5", "3")); 
} 
} 
));

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Я не нашел работающего решения, но я решил, что строка со значениями, разделенными запятыми, подвержена ошибкам и изменила сигнатуру метода DAO на Set, и поэтому измененный тест mockito для проверки на Set работает как положено:

verify(dao).updateMe(new HashSet<Integer>(Arrays.asList(2,5,3)))
0 голосов
/ 27 мая 2018

Ваш updateMe метод занимает String.Соответствующий в вашем подтверждении ожидает Collection.Возможно, вам лучше написать собственный сопоставитель.

Сначала вам нужно разбить запятую String на List из String s.

Затем используйте List::containsAll с вашими ожиданиями.

verify(dao).updateMe(argThat(t -> {
    List<String> inputs = Arrays.asList(t.split(","));
    return inputs.containsAll(Arrays.asList("2", "5", "3"));
}));
...