Czy ktoś wie, dlaczego zapewnia JUnit 4 assertEquals(foo,bar)
ale nie assertNotEqual(foo,bar)
metody?
Zapewnia assertNotSame
(odpowiada assertSame
) i assertFalse
(odpowiadaassertTrue
), więc wydaje się dziwne, że nie zawracali sobie tym głowy assertNotEqual
.
Nawiasem mówiąc, wiem, że JUnit-addons zapewnia metody, których szukam. Po prostu pytam z ciekawości.
Odpowiedzi:
Sugeruję użycie nowszych
assertThat()
stylów, które mogą łatwo opisywać wszelkiego rodzaju negacje i automatycznie budować opis tego, czego się spodziewałeś i co otrzymałeś, jeśli asercja się nie powiedzie:Wszystkie trzy opcje są równoważne, wybierz tę, którą uważasz za najbardziej czytelną.
Aby użyć prostych nazw metod (i pozwolić na działanie tej napiętej składni), potrzebujesz następujących importów:
źródło
assertNotEquals()
.assertNotEqual
” powiedziałbym, że to dlatego, że jest to wyspecjalizowane twierdzenie, które nie jest potrzebne tak często,assertEquals
a zatem byłoby wyrażane za pomocą ogólnegoassertFalse
.assertThat
jest o wiele bardziej wyrazisty niż ograniczony zestawassert*
dostępnych metod. Dlatego możesz wyrazić dokładne ograniczenia w jednym wierszu, odczytać je (prawie) jak zdanie w języku angielskim i otrzymać sensowną wiadomość, gdy potwierdzenie nie powiedzie się. To prawda, że nie zawsze jest to funkcja zabójcza, ale gdy zobaczysz ją kilka razy w akcji, zobaczysz, ile to dodaje.assertThat
jest bardziej ekspresyjny niżassert*
, ale nie sądzę, aby był bardziej ekspresyjny niż wyrażenie java, które można umieścić wewnątrz i na zewnątrz tegoassert*
wyrażenia (w końcu mogę wyrazić wszystko w kodzie Java). To ogólny problem, z którym zacząłem korzystać z płynnych interfejsów API - każdy jest w zasadzie nowym DSL, którego musisz się nauczyć (kiedy wszyscy już znamy Javę!). Podejrzewam, że Hamcrest jest teraz wystarczająco wszechobecny, że można się spodziewać, że ludzie to poznają. Będę się bawić ...Jest
assertNotEquals
w JUnit 4.11: https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md#improvements-to-assert-and-assumeźródło
Zastanawiam się tak samo. Interfejs API Assert nie jest bardzo symetryczny; do testowania, czy obiekty są takie same, zapewnia
assertSame
iassertNotSame
.Oczywiście nie jest za długo pisać:
Przy takim stwierdzeniu jedyną informacyjną częścią wyniku jest niestety nazwa metody testowej, dlatego komunikat opisowy należy utworzyć osobno:
Jest to oczywiście tak nużące, że lepiej rzucić własne
assertNotEqual
. Na szczęście w przyszłości może być częścią wydania JUnit: JUnit 22źródło
Twierdziłbym, że brak assertNotEqual jest rzeczywiście asymetrią i sprawia, że JUnit jest nieco mniej przyswajalny. Pamiętaj, że jest to dobry przypadek, gdy dodanie metody zmniejszyłoby złożoność interfejsu API, przynajmniej dla mnie: Symetria pomaga rządzić większą przestrzenią. Domyślam się, że przyczyną pominięcia może być zbyt mała liczba osób wzywających tę metodę. Pamiętam jednak czasy, w których nawet twierdzenie False nie istniało; stąd mam pozytywne oczekiwania, że metoda może zostać ostatecznie dodana, biorąc pod uwagę, że nie jest to trudna; chociaż przyznam, że istnieje wiele obejść, nawet eleganckich.
źródło
Przychodzę na tę imprezę dość późno, ale okazało się, że forma:
może sprawić, że będzie działać w większości przypadków „nie równych”.
źródło
Pracuję nad JUnit w środowisku java 8, używając jUnit4.12
dla mnie: kompilator nie mógł znaleźć metody assertNotEquals, nawet gdy jej użyłem
import org.junit.Assert;
Więc zmieniłem
assertNotEquals("addb", string);
na
Assert.assertNotEquals("addb", string);
Więc jeśli napotykasz problem związany z
assertNotEqual
nierozpoznaniem, zmień go naAssert.assertNotEquals(,);
ten, aby rozwiązać problemźródło
import static org.junit.Assert.*;
a będziesz mógł używać wszystkich twierdzeń bez nazwy klasy.Oczywistym powodem, dla którego ludzie chcieli assertNotEquals (), było porównanie wbudowanych programów bez konieczności wcześniejszej ich konwersji na obiekty o pełnym przepływie:
Pełen przykład:
vs.
Niestety, ponieważ Eclipse domyślnie nie zawiera JUnit 4.11, musisz być wyczerpujący.
Zastrzeżenie Nie sądzę, że „1” musi być zawinięte w Integer.valueOf (), ale ponieważ jestem nowo wrócony z .NET, nie liczę na moją poprawność.
źródło
Lepiej jest używać Hamcrest do negatywnych asercji niż assertFalse, ponieważ w poprzednim przypadku raport z testu pokaże różnicę w przypadku niepowodzenia asercji.
Jeśli używasz assertFalse, po prostu pojawia się błąd potwierdzenia w raporcie. tzn. utracono informacje o przyczynie awarii.
źródło
Zwykle robię to, gdy oczekuję, że dwa obiekty będą równe:
i:
kiedy oczekuje się, że będą nierówne. Zdaję sobie sprawę, że nie jest to odpowiedź na twoje pytanie, ale jest najbliższa, jaką mogę uzyskać. Może pomóc innym w poszukiwaniu tego, co mogą zrobić w wersjach JUnit przed JUnit 4.11.
źródło
Całkowicie zgadzam się z punktem widzenia PO.
Assert.assertFalse(expected.equals(actual))
nie jest naturalnym sposobem wyrażania nierówności.Ale chciałbym twierdzić, że dalej niż
Assert.assertEquals()
,Assert.assertNotEquals()
działa, ale nie jest przyjazny dla dokumentu co test faktycznie dochodzi do zrozumienia i / debug jak nie twierdzenie użytkownika.Tak więc JUnit 4.11 i JUnit 5 zapewniają
Assert.assertNotEquals()
(Assertions.assertNotEquals()
w JUnit 5), ale naprawdę unikam ich używania.Alternatywnie, aby potwierdzić stan obiektu, ogólnie używam interfejsu API dopasowywania, który łatwo wnika w stan obiektu, który wyraźnie dokumentuje intencję twierdzeń i jest bardzo przyjazny dla użytkownika, aby zrozumieć przyczynę niepowodzenia potwierdzenia.
Oto przykład.
Załóżmy, że mam klasę Animal, którą chcę przetestować,
createWithNewNameAndAge()
metodę, która tworzy nowy obiekt Animal, zmieniając jego nazwę i wiek, ale zachowując ulubione jedzenie.Załóżmy, że używam,
Assert.assertNotEquals()
aby stwierdzić, że oryginał i nowe obiekty są różne.Oto klasa Animal z wadliwą implementacją
createWithNewNameAndAge()
:JUnit 4.11+ (lub JUnit 5) zarówno jako narzędzie do testowania, jak i asercji
Test kończy się niepowodzeniem zgodnie z oczekiwaniami, ale przyczyna podana programistowi naprawdę nie jest pomocna. Po prostu mówi, że wartości powinny być różne i wyświetlać
toString()
wynik wywołany na rzeczywistymAnimal
parametrze:Ok, obiekty nie są równe. Ale gdzie jest problem?
Które pole nie jest poprawnie wycenione w testowanej metodzie? Jeden? Dwa? Wszyscy ?
Aby to odkryć, musisz wykopać
createWithNewNameAndAge()
implementację / użyć debuggera, podczas gdy testujący interfejs API byłby o wiele bardziej przyjazny, gdyby uczynił dla nas różnicę między tym, czego się oczekuje, a tym, co zostanie uzyskane.JUnit 4.11 jako test runner i testowy interfejs API Matchera jako narzędzie do asercji
Tutaj ten sam scenariusz testowy, ale wykorzystujący AssertJ (doskonały interfejs API dopasowywania testów) do potwierdzenia
Animal
stanu:Oczywiście test nadal się nie udaje, ale tym razem powód jest jasno określony:
Możemy odczytać, że w przypadku
Animal::getName, Animal::getAge, Animal::getFavoriteFood
wartości zwracanego zwierzęcia oczekujemy, że będą miały tę wartość:ale mieliśmy te wartości:
Wiemy więc, gdzie badać:
name
iage
nie są odpowiednio wyceniani. Dodatkowo fakt podaniahay
wartości w potwierdzeniuAnimal::getFavoriteFood()
pozwala również na dokładniejsze potwierdzenie zwróconegoAnimal
. Chcemy, aby obiekty nie były takie same dla niektórych właściwości, ale niekoniecznie dla wszystkich właściwości.Zdecydowanie użycie interfejsu API dopasowywania jest o wiele bardziej przejrzyste i elastyczne.
źródło
Spójność Modulo API, dlaczego JUnit nie podał,
assertNotEquals()
jest tym samym powodem, dla którego JUnit nigdy nie podał metod takich jakassertStringMatchesTheRegex(regex, str)
vs.assertStringDoesntMatchTheRegex(regex, str)
assertStringBeginsWith(prefix, str)
vs.assertStringDoesntBeginWith(prefix, str)
tzn. nie ma końca oferowanie określonych metod asercji dla rzeczy, których możesz chcieć w swojej logice asercji!
Znacznie lepiej, aby zapewnić jak się składać prymitywów testowych
equalTo(...)
,is(...)
,not(...)
,regex(...)
i niech ci kawałek programista razem zamiast więcej czytelności i rozsądku.źródło