Jak zwięźle zapewniłbyś równość Collection
elementów, a konkretnie Set
w JUnit 4?
java
unit-testing
collections
junit
Eqbal
źródło
źródło
Odpowiedzi:
Możesz stwierdzić, że te dwa
Set
s są sobie równe, co wywołujeSet
equals()
metodę .To
@Test
przejdzie, jeśli dwaSet
s mają ten sam rozmiar i zawierają te same elementy.źródło
equals
ihashCode
zaimplementowałeś w klasie, którą przechowujesz w Hashtable?Apache commons znowu na ratunek.
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.źródło
z hamakiem :
z prostym stwierdzeniem:
NB: t używana jest metoda equals () klasy zbioru konkretów
źródło
Szczególnie interesujący jest przypadek porównania
i
Jak dotąd jedynym rozwiązaniem, które widzę, jest zamiana obu w zestawy
Albo mógłbym porównać je element po elemencie.
źródło
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
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 ...
źródło
Sprawdź ten artykuł . Oto jeden przykład:
źródło
Korzystanie z Hamcrest:
Działa to również wtedy, gdy zestawy mają różne typy danych i zgłaszają różnicę, a nie tylko błąd.
źródło
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:
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.)
źródło
Podoba mi się rozwiązanie Hansa-Petera Störra ... Ale myślę, że nie jest do końca poprawne. Niestety
containsInAnyOrder
nie akceptujeCollection
żadnych obiektów do porównania. Musi więc być aCollection
zMatcher
s:Import to:
źródło