Java / JUnit - AssertTrue vs AssertFalse

[[5]}jestem całkiem nowy w Javie i podążam za samouczkami początkującego Eclipse Total . Wszystkie są bardzo pomocne, ale w lekcji 12 używa assertTrue dla jednego przypadku testowego i assertFalse dla drugiego. Oto kod:

// Check the book out to p1 (Thomas)
// Check to see that the book was successfully checked out to p1 (Thomas)
assertTrue("Book did not check out correctly", ml.checkOut(b1, p1));    // If checkOut fails, display message
assertEquals("Thomas", b1.getPerson().getName());

assertFalse("Book was already checked out", ml.checkOut(b1,p2));        // If checkOut fails, display message
assertEquals("Book was already checked out", m1.checkOut(b1,p2));

Szukałem dobrej dokumentacji na temat tych metod, ale nic nie znalazłem. Jeśli moje zrozumienie jest poprawne, assertTrue jak również assertFalse wyświetlają łańcuch, gdy drugi parametr zostanie obliczony na false. Jeśli tak, to jaki jest sens posiadania obu oni?

Edit: chyba widzę, co mnie myliło. Autor mógł umieścić oba z nich tylko po to, aby pokazać ich funkcjonalność(w końcu jest to samouczek). I ustawił taki, który by się nie powiódł, żeby wiadomość została wydrukowana i powiedziała mi, dlaczego się nie powiodła. Zaczyna mieć sens...Myślę, że to jest wyjaśnienie, ale nie jestem pewien.

Author: Thomas, 2010-07-14

7 answers

assertTrue nie powiedzie się, jeśli drugi parametr wywoła wartość false (innymi słowy, zapewnia, że wartość jest prawdziwa). assertFalse robi odwrotnie.

assertTrue("This will succeed.", true);
assertTrue("This will fail!", false);

assertFalse("This will succeed.", false);
assertFalse("This will fail!", true);

Jak w przypadku wielu innych rzeczy, najlepszym sposobem na zapoznanie się z tymi metodami jest po prostu eksperymentowanie :-).

 95
Author: Matt Solnit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-13 20:19:09

Twoje zrozumienie jest błędne, w takich przypadkach zawsze skonsultuj się z JavaDoc .

AssertFalse

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

Twierdzi, że warunek jest fałszywy. Jeśli tak nie jest, rzuca Asertionerror z podaną wiadomością.

Parametry:

  • message - komunikat identyfikujący dla AssertionError (null)
  • condition - warunek do sprawdzenia
 26
Author: feeling abused and harassed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-28 15:15:33

Chodzi o semantykę. W assertTrue twierdzisz, że wyrażenie jest prawdziwe. Jeśli tak nie jest, to wyświetli komunikat i twierdzenie się nie powiedzie. W assertFalse, twierdzisz, że wyrażenie jest ewaluowane na false. Jeżeli tak nie jest, wtedy zostanie wyświetlona wiadomość i stwierdzenie nie powiedzie się.

assertTrue (message, value == false) == assertFalse (message, value);

Są funkcjonalnie takie same, ale jeśli oczekujesz, że wartość będzie false , użyj assertFalse. Jeśli oczekujesz, że wartość będzie true, użyj assertTrue.

 9
Author: Xetius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-31 10:44:15

Myślę, że to tylko dla Twojej wygody (i czytelników Twojego kodu)

Twój kod i twoje testy jednostkowe powinny być idealnie samodzielne, w czym pomaga to API,

Pomyśl abt co jest bardziej czytelne do przeczytania:

AssertTrue(!(a > 3));

Lub

AssertFalse(a > 3);

Kiedy otwierasz testy po XX miesiącach, kiedy nagle zawodzą, dużo mniej czasu zajmie ci zrozumienie, co poszło nie tak w drugim przypadku (moja opinia). Jeśli się nie zgadzasz, zawsze możesz trzymać się AssertTrue dla wszystkich przypadki:)

 8
Author: tdobek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-13 20:26:32

Twoja pierwsza reakcja na te metody jest dla mnie dość interesująca. Użyję go w przyszłych argumentach, że zarówno assertTrue, jak i assertFalse nie są najbardziej przyjaznymi narzędziami. Jeśli użyjesz

assertThat(thisOrThat, is(false));

Jest znacznie bardziej czytelny i wyświetla lepszy komunikat o błędzie.

 7
Author: iwein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-14 22:22:25

assertTrue nie powiedzie się, jeśli sprawdzona wartość jest false, a assertFalse zrobi odwrotnie: nie powiedzie się, jeśli sprawdzona wartość jest true.

Inna sprawa, Twoje ostatnie twierdzenie prawdopodobnie zawiedzie, Ponieważ porówna łańcuch "Book was already checked out" z wyjściem m1.checkOut (b1, p2). Potrzebuje trzeciego parametru(drugiej wartości, aby sprawdzić równość).

 2
Author: bashflyng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-13 20:22:16

Kurs zawiera błąd logiczny:

    assertTrue("Book check in failed", ml.checkIn(b1));

    assertFalse("Book was aleready checked in", ml.checkIn(b1));

W pierwszym twierdzeniu oczekujemy, że checkIn zwróci True (ponieważ checkin odnosi sukces). Jeśli to się nie powiedzie, wydrukujemy komunikat w stylu " book check in failed. Teraz w drugiej linijce spodziewamy się, że checkIn się nie powiedzie, ponieważ książka była sprawdzana już w pierwszej linijce. Więc oczekujemy, że checkIn zwróci False. Jeśli z jakiegoś powodu checkin zwraca True (czego się nie spodziewamy), to wiadomość nigdy nie powinna być "książka była już check in", Bo checkin był udany.

 2
Author: Ronald Mos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-30 12:07:16