Jak zapewnić więcej niż za pomocą JUnit Assert?

118

Mam te wartości pochodzące z testu

previousTokenValues[1] = "1378994409108"
currentTokenValues[1] = "1378994416509"

i próbuję

    // current timestamp is greater
    assertTrue(Long.parseLong(previousTokenValues[1]) > Long.parseLong(currentTokenValues[1]));

Dostaję java.lang.AssertionErrori detailMessagepo debugowaniu jest null.

Jak mogę zapewnić więcej niż warunki w użyciu JUnit

marzyciel
źródło
Prześlij również cały kod z pełnym komunikatem o błędzie. Być może twoja instrukcja asercji jest przed inicjalizacją tablicy.
Josh M

Odpowiedzi:

153

Po prostu jak to zrobiłeś. assertTrue(boolean)ma również przeciążenie, w assertTrue(String, boolean)którym Stringjest komunikat w przypadku awarii; możesz tego użyć, jeśli chcesz wydrukować, że taki a taki nie był większy niż taki a taki.

Możesz również dodać hamcrest-alljako zależność, aby użyć dopasowań. Zobacz https://code.google.com/p/hamcrest/wiki/Tutorial :

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

assertThat("timestamp",
           Long.parseLong(previousTokenValues[1]),
           greaterThan(Long.parseLong(currentTokenValues[1])));

To daje błąd taki jak:

java.lang.AssertionError: timestamp
Expected: a value greater than <456L>
     but: <123L> was less than <456L>
yshavit
źródło
3
Do Twojej wiadomości, tutaj jest link do, OrderingComparisonktóry zawiera greaterThan: hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/number/ ...
John B
7
<groupId>org.hamcrest</groupId>,<artifactId>hamcrest-all</artifactId>
gavenkoa
2
Zauważ, że Hamcrest jest dołączony domyślnie, gdy używasz JUnit 4.11, więc nie ma potrzeby wyszukiwania zależności.
Chanoch,
3
Uważaj na kolejność odniesień do hamcrest i junit .
Don Kirkby
9
@Chanoch Mam junit 4.12, który przejściowo zależy od hamcrest-core 1.3. W klasie org.hamcrest.CoreMatchers nie ma metody GreaterThan. Jeśli dodam hamcrest-all 1.3 jako dodatkową zależność, dostarczymy metodę org.hamcrest.Matchers.greaterThan.
Anthony Hayward
18

Korzystając z JUnit asserts, zawsze staram się, aby przekaz był ładny i jasny. Oszczędza ogromne ilości czasu podczas debugowania. Robiąc to w ten sposób, unika się konieczności dodawania dodatkowej zależności od hamcrest Matchers.

previousTokenValues[1] = "1378994409108";
currentTokenValues[1] = "1378994416509";

Long prev = Long.parseLong(previousTokenValues[1]);
Long curr = Long.parseLong(currentTokenValues[1]);
assertTrue("Previous (" + prev + ") should be greater than current (" + curr + ")", prev > curr);
Qwerky
źródło
Fajne rozwiązanie, naprawdę czyste.
Óscar Andreu
13

możesz też wypróbować poniższe proste rozwiązanie:

previousTokenValues[1] = "1378994409108";
currentTokenValues[1] = "1378994416509";

Long prev = Long.parseLong(previousTokenValues[1]);
Long curr = Long.parseLong(currentTokenValues[1]);

Assert.assertTrue(prev  > curr );   
user3293666
źródło
9

Powinieneś dodać bibliotekę Hamcrest do swojej ścieżki budowania. Zawiera potrzebną Matchers.class, która ma metodę lessThan ().

Zależność jak poniżej.

<dependency>
  <groupId>org.hamcrest</groupId>
  <artifactId>hamcrest-library</artifactId>
  <version>1.3</version>
  <scope>test</scope>
</dependency>
嘉 恒 陶
źródło
2
assertTrue("your message", previousTokenValues[1].compareTo(currentTokenValues[1]) > 0)

to przechodzi dla poprzednich> bieżących wartości

Dave Richardson
źródło
1

Alternatywnie, jeśli dodanie dodatkowej biblioteki, takiej jak hamcrestnie jest pożądane, logikę można zaimplementować jako metodę narzędziową przy użyciu junittylko zależności:

public static void assertGreaterThan(int greater, int lesser) {
    assertGreaterThan(greater, lesser, null);
}

public static void assertGreaterThan(int greater, int lesser, String message) {
    if (greater <= lesser) {
        fail((StringUtils.isNotBlank(message) ? message + " ==> " : "") +
                "Expected: a value greater than <" + lesser + ">\n" +
                "But <" + greater + "> was " + (greater == lesser ? "equal to" : "less than") + " <" + lesser + ">");
    }
}
Andrey
źródło
1

Jak wiem, w tej chwili w JUnit składnia jest następująca:

AssertTrue(Long.parseLong(previousTokenValues[1]) > Long.parseLong(currentTokenValues[1]), "your fail message ");

Oznacza to, że stan jest przed wiadomością.

Thanh Huy Le
źródło
0

Możesz to tak ująć

  assertTrue("your fail message ",Long.parseLong(previousTokenValues[1]) > Long.parseLong(currentTokenValues[1]));
kos014
źródło