Утверждение коллекции имеет несколько экземпляров элемента в Java? - PullRequest
2 голосов
/ 08 февраля 2012

Ответ на на этот старый вопрос рекомендует Hamcrest для утверждения в коллекциях.

Что произойдет, если я хочу утверждать, что коллекция имеет несколько экземпляров объекта?

list = newArrayList();
list.add(1);
list.add(1);
list.add(2);
assertThat(list, hasItems(1, 2, 2)); // This should fail
assertThat(list, hasItems(1, 2, 1)); // This should pass

Код Hamcrest, который я пробовал, не заботится о множественности - оба утверждения выше пройдут.

Ответы [ 6 ]

2 голосов
/ 09 февраля 2012

Guava's Multiset предназначен для эффективного отслеживания множественных вхождений элементов.

Multiset<E> multiset = HashMultiset.create(collection);

и затем у вас есть несколько вхождений x, если multiset.count(x) > 1.

1 голос
/ 11 февраля 2012
assertEquals(2, Collections.frequency(list, 1));
assertEquals(1, Collections.frequency(list, 2));

Конечно, вы можете использовать обозначение Hamcrest, если хотите.

Преимущество многократного по сравнению с некоторыми другими ответами: вы не можете быть владельцем коллекции, поэтому вы не можетеиметь контроль над тем, какую реализацию использовать.И, кроме того, вы не ограничены типом Коллекции (Список, Набор и т. Д.), На котором можно использовать эту технику.

Спасибо за вопрос, я бы не подумал об этом иначе: -)

0 голосов
/ 08 февраля 2012

Вы можете использовать Multimap Guava, который в основном представляет собой карту ключей -> список значений.В этом случае вам важен не список значений, а его размер.Вы должны создать следующую мультикарту из вашего списка:

1 -> [1, 1]
2 -> [2]

Тогда вы можете

Assert.assertEquals(2, map.get(1).size());

, что гарантирует, что в вашем исходном списке ровно две "1".

Если вы не хотите зависеть от Гуавы, просто создайте Карту каждого числа с его счетом, что требует немного большей бухгалтерии, но в целом все еще довольно просто.

0 голосов
/ 08 февраля 2012

Самая простая техника, которую я могу придумать, это сначала отсортировать список, а затем использовать сравнение на равенство:

Collections.sort(list);

А потом:

assertEquals(Arrays.asList(1, 1, 2), list);
0 голосов
/ 08 февраля 2012

Может быть, это только я, но, похоже, HashMap - твой друг.Я что-то пропустил?

0 голосов
/ 08 февраля 2012

Напиши еще одно утверждение самостоятельно. Это утверждение может использовать следующую технику:

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