Як би ви лаконічно стверджували рівність Collection
елементів, зокрема Set
у JUnit 4?
Як би ви лаконічно стверджували рівність Collection
елементів, зокрема 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
s однакового розміру і містять однакові елементи.
equals
і hashCode
реалізований у класі, який ви зберігаєте у своєму Hashtable?
Апач знову приходить на допомогу.
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});
підхід буде для вас набагато більш читабельним та налагоджуваним (всі колекції підтримують arraray (), тому використовувати методи 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)));
Це також працює, коли набори мають різні типи даних, і звітність про різницю, а не просто збій.
Якщо ви хочете перевірити, чи містить список чи набір певні значення (замість того, щоб порівнювати його з уже існуючою колекцією), часто метод колекцій 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
з:
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;