Jak zwięźle zapewniłbyś równość Collection
elementów, a konkretnie Set
w JUnit 4?
Jak zwięźle zapewniłbyś równość Collection
elementów, a konkretnie Set
w JUnit 4?
Odpowiedzi:
Możesz stwierdzić, że te dwa Set
s są sobie równe, co wywołuje Set
equals()
metodę .
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 );
}
}
To @Test
przejdzie, jeśli dwa Set
s mają ten sam rozmiar i zawierają te same elementy.
equals
i hashCode
zaimplementowałeś w klasie, którą przechowujesz w Hashtable?
Apache commons znowu na ratunek.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Działa jak marzenie. Nie wiem dlaczego, ale stwierdziłem, że w przypadku kolekcji poniższe assertEquals(coll1, coll2)
nie zawsze działają. Na wypadek, gdyby mi się nie udało, miałem dwie kolekcje wspierane przez zestawy. Ani hamcrest, ani junit nie powiedzieliby, że kolekcje są równe, chociaż wiedziałem na pewno, że tak. Korzystanie z CollectionUtils działa doskonale.
z hamakiem :
assertThat(s1, is(s2));
z prostym stwierdzeniem:
assertEquals(s1, s2);
NB: t używana jest metoda equals () klasy zbioru konkretów
Szczególnie interesujący jest przypadek porównania
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
i
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
Jak dotąd jedynym rozwiązaniem, które widzę, jest zamiana obu w zestawy
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
Albo mógłbym porównać je element po elemencie.
Jako dodatkową metodę opartą na tablicy ... możesz rozważyć użycie nieuporządkowanych asercji tablicowych w junitx. Chociaż przykład Apache CollectionUtils będzie działał, jest tam również pakiet solidnych rozszerzeń asercji:
Myślę że
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
podejście będzie znacznie bardziej czytelne i możliwe do debugowania (wszystkie kolekcje obsługują toArray (), więc użycie metod ArrayAssert powinno być dość łatwe.
Oczywiście wadą jest to, że junitx jest dodatkowym plikiem jar lub wpisem maven ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
Sprawdź ten artykuł . Oto jeden przykład:
@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);
}
Korzystanie z Hamcrest:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
Działa to również wtedy, gdy zestawy mają różne typy danych i zgłaszają różnicę, a nie tylko błąd.
Jeśli chcesz sprawdzić, czy lista lub zestaw zawiera zestaw określonych wartości (zamiast porównywać je z już istniejącą kolekcją), często przydaje się metoda kolekcji toString:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
Jest to trochę krótsze niż pierwsze skonstruowanie oczekiwanej kolekcji i porównanie jej z rzeczywistą kolekcją oraz łatwiejsze do napisania i poprawienia.
(Wprawdzie nie jest to szczególnie czysta metoda i nie jest w stanie odróżnić elementu „foo, bar” od dwóch elementów „foo” i „bar”. Ale w praktyce myślę, że najważniejsze jest to, że pisanie testów jest łatwe i szybkie , w przeciwnym razie wielu programistów po prostu tego nie zrobi bez naciskania.)
Podoba mi się rozwiązanie Hansa-Petera Störra ... Ale myślę, że nie jest do końca poprawne. Niestety containsInAnyOrder
nie akceptuje Collection
żadnych obiektów do porównania. Musi więc być a Collection
z Matcher
s:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
Import to:
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;