Wie kann man mehr behaupten als mit JUnit Assert?

117

Ich habe diese Werte aus einem Test

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

und ich versuche es

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

Ich bekomme das java.lang.AssertionErrorund detailMessagebeim Debuggen ist null.

Wie kann ich bei der Verwendung mehr als die Bedingungen behaupten? JUnit

Tagträumer
quelle
Veröffentlichen Sie auch den gesamten Code mit der vollständigen Fehlermeldung. Möglicherweise befindet sich Ihre Assertion-Anweisung vor der Array-Initialisierung.
Josh M

Antworten:

153

Wie du es gemacht hast. assertTrue(boolean)hat auch eine Überlastung, assertTrue(String, boolean)bei der Stringdie Meldung im Fehlerfall angezeigt wird; Sie können das verwenden, wenn Sie drucken möchten, dass das und das nicht größer als das und das war.

Sie können auch hamcrest-allals Abhängigkeit hinzufügen , um Matcher zu verwenden. Siehe 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])));

Das gibt einen Fehler wie:

java.lang.AssertionError: timestamp
Expected: a value greater than <456L>
     but: <123L> was less than <456L>
yshavit
quelle
3
Zu Ihrer Information , hier ist der Link, OrderingComparisonder enthält greaterThan: hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/number/…
John B
7
<groupId>org.hamcrest</groupId>,<artifactId>hamcrest-all</artifactId>
Gavenkoa
2
Beachten Sie, dass Hamcrest standardmäßig enthalten ist, wenn Sie JUnit 4.11 verwenden, sodass Sie nicht nach der Abhängigkeit suchen müssen.
Chanoch
3
Seien Sie vorsichtig mit der Reihenfolge der Hamcrest- und Junit-Referenzen .
Don Kirkby
9
@Chanoch Ich habe Junit 4.12, der transitiv von Hamcrest-Core 1.3 abhängt. Es gibt keine GreaterThan-Methode für die Klasse org.hamcrest.CoreMatchers. Wenn ich hamcrest-all 1.3 als zusätzliche Abhängigkeit hinzufüge, wird die Methode org.hamcrest.Matchers.greaterThan bereitgestellt.
Anthony Hayward
18

Wenn ich JUnit Asserts verwende, mache ich die Nachricht immer schön und klar. Dies spart enorm viel Zeit beim Debuggen. Auf diese Weise wird vermieden, dass eine zusätzliche Abhängigkeit von Hamcrest-Matchern hinzugefügt werden muss.

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
quelle
Schöne Lösung, sehr sauber.
Óscar Andreu
13

Sie können auch unten einfache Lösung versuchen:

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

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

Assert.assertTrue(prev  > curr );   
user3293666
quelle
9

Sie sollten Ihrem Build-Pfad die Hamcrest-Bibliothek hinzufügen. Es enthält die benötigte Matchers.class mit der lessThan () -Methode.

Abhängigkeit wie unten.

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

Dies gilt für vorherige> aktuelle Werte

Dave Richardson
quelle
1

Wenn alternativ eine zusätzliche Bibliothek hinzugefügt werden kann, wie dies hamcrestnicht wünschenswert ist, kann die Logik als Dienstprogrammmethode junitnur unter Verwendung der Abhängigkeit implementiert werden :

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
quelle
1

Wie ich im Moment in JUnit erkenne, lautet die Syntax wie folgt:

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

Bedeutet, dass die Bedingung vor der Nachricht steht.

Thanh Huy Le
quelle
0

Sie können es so ausdrücken

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