Как бы вы лаконично заявили о равенстве Collection
элементов, в частности a Set
в JUnit 4?
Как бы вы лаконично заявили о равенстве Collection
элементов, в частности a Set
в JUnit 4?
Ответы:
Вы можете утверждать, что два Set
s равны друг другу, что вызывает Set
equals()
метод .
public class SimpleTest {
private Set<String> setA;
private Set<String> setB;
@Before
public void setUp() {
setA = new HashSet<String>();
setA.add("Testing...");
setB = new HashSet<String>();
setB.add("Testing...");
}
@Test
public void testEqualSets() {
assertEquals( setA, setB );
}
}
Это @Test
пройдет, если два Set
элемента имеют одинаковый размер и содержат одинаковые элементы.
equals
и hashCode
реализован ли класс, который вы храните в своей Hashtable?
Apache снова приходит на помощь.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Работает как шарм. Не знаю почему, но я обнаружил, что с коллекциями assertEquals(coll1, coll2)
не всегда работает следующее. В случае, если это не удалось для меня, у меня было две коллекции, поддерживаемые Sets. Ни хамкрест, ни юнит не сказали бы, что коллекции были равны, хотя я точно знал, что они равны. Используя CollectionUtils, он отлично работает.
с окорочком :
assertThat(s1, is(s2));
с простым утверждением:
assertEquals(s1, s2);
Примечание: Метод т равенства () из множества бетона класса используется
Особенно интересен случай, когда вы сравниваете
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
и
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
Пока что единственное решение, которое я вижу, - это заменить их оба наборами
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
Или я мог бы сравнить их элемент за элементом.
В качестве дополнительного метода, основанного на массиве ... вы можете рассмотреть возможность использования утверждений неупорядоченного массива в junitx. Хотя пример Apache CollectionUtils будет работать, там также есть набор надежных расширений утверждений:
Я думаю, что
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
подход будет гораздо более читаемым и отлаживаемым для вас (все коллекции поддерживают toArray (), поэтому использование методов ArrayAssert должно быть достаточно простым.
Конечно, недостатком здесь является то, что junitx - это дополнительный файл jar или запись maven ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
Проверьте эту статью . Один пример оттуда:
@Test
public void listEquality() {
List<Integer> expected = new ArrayList<Integer>();
expected.add(5);
List<Integer> actual = new ArrayList<Integer>();
actual.add(5);
assertEquals(expected, actual);
}
Использование Hamcrest:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
Это также работает, когда наборы имеют разные типы данных, и сообщает о различиях, а не просто об ошибках.
Если вы хотите проверить, содержит ли List или Set набор определенных значений (вместо сравнения его с уже существующей коллекцией), часто бывает удобен метод toString коллекций:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
Это немного короче, чем первое построение ожидаемой коллекции и сравнение ее с фактической коллекцией, и ее проще написать и исправить.
(Следует признать, что это не особо чистый метод, и он не может отличить элемент «foo, bar» от двух элементов «foo» и «bar». Но на практике я думаю, что наиболее важным является то, что писать тесты легко и быстро. , иначе многие разработчики просто не будут без давления.)
Мне нравится решение Ханса-Петера Штёрра ... Но я считаю, что оно не совсем правильное. К сожалению containsInAnyOrder
, не приемлет ни Collection
одного объекта для сравнения. Так что это должно быть Collection
из Matcher
s:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
Импорт:
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;