Załóżmy, że chcę przetestować jednostkowo metodę z tym podpisem:
List<MyItem> getMyItems();
Załóżmy, że MyItem
jest to Pojo, które ma wiele właściwości, z których jedna jest "name"
dostępna przez getName()
.
Jedyne, co mi zależy na weryfikacji, to to List<MyItem>
, czy element lub any Iterable
zawiera dwa MyItem
wystąpienia, których "name"
właściwości mają wartości "foo"
i "bar"
. Jeśli jakiekolwiek inne właściwości nie pasują, nie obchodzą mnie cele tego testu. Jeśli nazwy pasują do siebie, jest to udany test.
Chciałbym, żeby to było jednowierszowe, jeśli to możliwe. Oto trochę „pseudo-składni” tego rodzaju, co chciałbym zrobić.
assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});
Czy Hamcrest byłby dobry do tego typu rzeczy? Jeśli tak, to jaka dokładnie byłaby wersja hamcrest powyższej pseudo-składni?
źródło
Nie jest to szczególnie Hamcrest, ale myślę, że warto o tym tutaj wspomnieć. To, czego często używam w Javie8, to coś takiego:
(Zredagowano zgodnie z niewielką poprawą Rodrigo Manyariego. Jest trochę mniej szczegółowa. Zobacz komentarze).
Może to być trochę trudniejsze do odczytania, ale podoba mi się typ i bezpieczeństwo refaktoryzacji. Jest również fajny do testowania wielu właściwości fasoli w połączeniu. np. z wyrażeniem && podobnym do języka java w filtrze lambda.
źródło
Assertj jest w tym dobry.
Dużym plusem assertj w porównaniu do hamcrest jest łatwość uzupełniania kodu.
źródło
AssertJ zapewnia doskonałą funkcję w
extracting()
: możesz podaćFunction
s, aby wyodrębnić pola. Zapewnia kontrolę w czasie kompilacji.Możesz również łatwo ustalić rozmiar jako pierwszy.
Dałoby to:
containsExactlyInAnyOrder()
potwierdza, że lista zawiera tylko te wartości, niezależnie od kolejności.Aby potwierdzić, że lista zawiera te wartości niezależnie od kolejności, ale może również zawierać inne wartości, użyj
contains()
:Na marginesie: aby potwierdzić wiele pól z elementów a
List
, za pomocą AssertJ robimy to, opakowując oczekiwane wartości dla każdego elementu wtuple()
funkcję:źródło
Dopóki List jest klasą konkretną, możesz po prostu wywołać metodę zawiera (), o ile zaimplementowano metodę equals () w MyItem.
Zakłada się, że zaimplementowano konstruktora, który akceptuje wartości, dla których chcesz potwierdzić. Zdaję sobie sprawę, że to nie jest w jednej linii, ale warto wiedzieć, której wartości brakuje, zamiast sprawdzać obie na raz.
źródło
AssertJ 3.9.1 obsługuje bezpośrednie użycie predykatów w
anyMatch
metodzie.Jest to ogólnie odpowiedni przypadek użycia dla dowolnie złożonych warunków.
W przypadku prostych warunków wolę używać
extracting
metody (patrz powyżej), ponieważ wynikowe iterowalne testy mogą wspierać weryfikację wartości z lepszą czytelnością. Przykład: może zapewnić wyspecjalizowane API, takie jakcontains
metoda w odpowiedzi Franka Neblunga. Lub możeszanyMatch
go później wywołać i użyć odwołania do metody, takiego jak"searchedvalue"::equals
. Doextracting
metody można również wprowadzić wiele ekstraktorów , a następnie zweryfikować wynik za pomocątuple()
.źródło