2009-07-08 15 views
383

Czy ktoś wie, dlaczego JUnit 4 oferuje metody assertEquals(foo,bar), ale nie ?Dlaczego JUnit nie dostarcza metod assertNotEquals?

Zapewnia assertNotSame (odpowiadające assertSame) i assertFalse (odpowiadające assertTrue), więc wydaje się dziwne, że nie przeszkadza w tym assertNotEqual.

Nawiasem mówiąc, wiem, że JUnit-addons zapewnia metody, których szukam. Po prostu pytam z ciekawości.

Odpowiedz

376

Sugeruję użyć nowszych assertThat() styl twierdzi, które można łatwo opisać wszystkie rodzaje negacji i automatycznie budować opis czego oczekuje i co masz Jeśli asercja nie powiedzie się:

assertThat(objectUnderTest, is(not(someOtherObject))); 
assertThat(objectUnderTest, not(someOtherObject)); 
assertThat(objectUnderTest, not(equalTo(someOtherObject))); 

Wszystkie trzy opcje są równoważne, wybierz ten, który najbardziej czytelny.

Aby korzystać z prostych nazw metod (i pozostawić ten napięta składnia do pracy), trzeba te Import:

import static org.junit.Assert.*; 
import static org.hamcrest.CoreMatchers.*; 
+124

Doceniam wskaźnik do alternatywnej składni asercji, ale wskazanie gdzie indziej nie odpowiada * dlaczego * JUnit nigdy nie dostarczyło 'assertNotEquals()'. – seh

+14

@seh: Sposób, w jaki to przeczytałem, nie dotyczył zainteresowania historycznego, ale sposobu formułowania stwierdzenia "te dwa obiekty nie są równe" w teście JUnit. Odpowiedziałem na to.Biorąc pod uwagę "dlaczego jest/nie było" assertNotEqual ", powiedziałbym, że to dlatego, że jest to wyspecjalizowany aser, który nie jest potrzebny tak często, jak' assertEquals', a zatem byłby wyrażany poprzez ogólne 'assertFalse'. –

+10

również zaimportować statyczny org.junit.Assert.assertThat; –

47

Zastanawiam się samo. Interfejs API Assert nie jest bardzo symetryczny; do testowania, czy obiekty są takie same, zapewnia assertSame i assertNotSame.

Oczywiście, to nie jest zbyt długi, aby napisać:

assertFalse(foo.equals(bar)); 

Z takim twierdzeniem, jedyną częścią informacyjny wyjścia jest niestety nazwa metody badawczej, wiadomo więc opisowe powinny być formowane osobno :

String msg = "Expected <" + foo + "> to be unequal to <" + bar +">"; 
assertFalse(msg, foo.equals(bar)); 

to jest oczywiście tak nudny, że lepiej jest, aby rzucić swój własny assertNotEqual. Na szczęście w przyszłości będzie to może być częścią JUnit: JUnit issue 22

+19

Jest to mniej użyteczne, ponieważ JUnit nie może wygenerować użytecznego komunikatu o błędzie informującego Cię, na przykład, o nierównych wartościach foo i bar. Prawdziwy powód niepowodzenia jest ukryty i przekształcony w prostą wartość boolowską. –

+3

Całkowicie się zgadzam. Szczególnie assertFalse potrzebuje odpowiedniego argumentu komunikatu, aby wygenerować dane wyjściowe, aby powiedzieć, co naprawdę poszło nie tak. –

+0

Myślę, że jest to przydatne do testów obecnych tekstu. Thnx –

1

lepiej jest użyć Hamcrest negatywnych twierdzeń zamiast assertFalse jak w poprzednim raport z testu pokaże różnicę dla błędu asercji.

Jeśli użyjesz assertFalse, otrzymasz w raporcie niepowodzenie asercji. tj. utracono informację o przyczynie awarii.

12

Twierdzę, że brak assertNotEqual jest rzeczywiście asymetrią i sprawia, że ​​JUnit jest nieco mniej poznawalny. Pamiętaj, że jest to dobry przypadek, kiedy dodanie metody zmniejszyłoby złożoność API, przynajmniej dla mnie: Symmetry pomaga rządzić większą przestrzenią. Domyślam się, że powodem tego zaniedbania może być to, że zbyt mało osób domaga się tej metody. Pamiętam jednak czas, w którym nawet assertFalse nie istniało; w związku z tym mam pozytywne oczekiwania, że ​​metoda może zostać ostatecznie dodana, ponieważ nie jest trudna; mimo że przyznaję, że istnieją liczne rozwiązania, nawet te eleganckie.

6

Wracam do tej partii dość późno, ale odkryłem, że postać:

static void assertTrue(java.lang.String message, boolean condition) 

można pracować dla większości „nie równa się” przypadkach.

int status = doSomething() ; // expected to return 123 
assertTrue("doSomething() returned unexpected status", status != 123) ; 
+3

Podczas gdy to działa, problem polega na tym, że jeśli asercja nie powiedzie się, po prostu powie" Exepcted true, but was false "lub jakieś inne niejasne stwierdzenie. Byłoby świetnie, gdyby oczekiwano 123, ale było 123. –

133

Jest assertNotEquals w JUnit 4.11: https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md#improvements-to-assert-and-assume

import static org.junit.Assert.assertNotEquals; 
+0

Widzę nawet assertNotSame() w Junit 4.12-beta2. – Tirumudi

+1

Mind, jeden z artefaktów jmock (2.6.0) przecieka starą wersję junit-dep, która z kolei ma klasę Assert bez assertNotEquals. Lepiej to wykluczyć, używając bluszczu. – gkephorus

+3

Używam 4.12, ale nadal nie mogę znaleźć assertNotEqual. : s –

3

Oczywistym powodem, że ludzie chcieli assertNotEquals() było porównanie poleceń wbudowanych bez konieczności konwertowania ich do pełnowartościowy obiektów pierwsze:

Szczegółowy przykład:

.... 
assertThat(1, not(equalTo(Integer.valueOf(winningBidderId)))); 
.... 

kontra

assertNotEqual(1, winningBidderId); 

Niestety, ponieważ Eclipse nie zawiera domyślnie JUnit 4.11, musisz być rozwlekły.

Nie sądzę, że "1" musi być zawinięty w Integer.valueOf(), ale ponieważ jestem nowo zwrócony z .NET, nie licz na moją poprawność.

-2

Modulo konsystencja API, dlaczego JUnit nie podał assertNotEquals() jest ten sam powód, JUnit nigdy warunkiem metod jak

  • assertStringMatchesTheRegex(regex, str) vs. assertStringDoesntMatchTheRegex(regex, str)
  • assertStringBeginsWith(prefix, str) vs. assertStringDoesntBeginWith(prefix, str)

czyli tam Nie ma końca, aby zapewnić konkretne metody asercji dla rodzajów rzeczy, które możesz chcieć w logice twierdzenia!

Lepiej zapewnić dające się składać prymitywów testowych jak equalTo(...), is(...), not(...), regex(...) i pozwól kawałek programista tych razem zamiast więcej czytelności i rozsądku.

+3

cóż, z jakiegoś powodu istnieje assertEquals(). Nie musiało, ale tak. Pytanie dotyczyło braku symetrii - dlaczego istnieje assertEquals, ale nie jego odpowiednik? – foo

3

pracuję nad JUnit w środowisku Java 8, używając jUnit4.12

dla mnie: kompilator nie był w stanie znaleźć assertNotEquals metodzie, nawet gdy użyłem
import org.junit.Assert;

Więc zmieniłem
assertNotEquals("addb", string);
do
Assert.assertNotEquals("addb", string);

więc jeśli stoją problem dotyczący assertNotEqual nie rozpoznał, a następnie zmienić go Assert.assertNotEquals(,); powinien rozwiązać twój problem.

+1

Dzieje się tak, ponieważ metody są statyczne i należy je zaimportować statycznie. Użyj tego 'import static org.junit.Assert. *;' I będziesz mógł używać wszystkich asserts bez nazwy klasy. –

Powiązane problemy