Определить два списка равны, не заботясь о заказе Мокито - PullRequest
2 голосов
/ 18 июня 2019

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

List<String> myListToMatch = new ArrayList<String>();
myListToMatch .add("1");
myListToMatch .add("2");
when(obj.methodName(eq(myListToMatch))).thenReturn("someStringValue");

Из-за упорядочения, как в вызываемом методе, список идет как ["2", "1"], который не возвращает "someStringValue" согласно вышеуказанной заглушке, которая влияет на мой тестовый пример. Любая помощь приветствуется. Я использую библиотеку Mockito. У меня нет зависимости от Hamcrest (не хочу добавлять).

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

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Прежде всего, если вы не заботитесь о порядке элементов, вы можете вместо этого пойти на набор. В качестве альтернативы вы могли бы также следовать реализации, приведенной в следующем ответе , который тесно согласуется с вашей формулировкой проблемы.

Если вы используете Java 8 и более новые версии Mockito, вы можете написать следующий фрагмент кода. Это взято из здесь

when(
   mock.method(argThat(t -> t.containsAll(Arrays.asList("1","2"))))
).thenReturn(myValue);

Пожалуйста, дайте мне знать, если это отвечает на ваш вопрос.

0 голосов
/ 18 июня 2019

Предполагая, что вы на самом деле заботитесь о количестве вхождений, самый простой способ - создать Map<String, Long>, где ключ - это элемент в списке, а значение - количество вхождений этого элемента:

Map<String, Long> map =
    list.stream()
        .collect(Collectors.groupingBy(a -> a, Collectors.counting()));

Постройте эту карту для каждого из ожидаемых и фактических списков, затем сравните их на равенство.

...