Warum bietet JUnit keine assertNotEquals-Methoden?

Lesezeit: 6 Minuten

Benutzer-Avatar
Chris B

Weiß jemand, warum JUnit 4 bietet assertEquals(foo,bar) aber nicht assertNotEqual(foo,bar) Methoden?

Es bietet assertNotSame (korrespondierend zu assertSame) und assertFalse (korrespondierend zu assertTrue), also scheint es seltsam, dass sie sich nicht darum gekümmert haben assertNotEqual.

Übrigens weiß ich, dass JUnit-Addons die Methoden bietet, nach denen ich suche. Ich frage nur aus Neugier.

Benutzer-Avatar
Joachim Sauer

Ich würde vorschlagen, dass Sie die neuere verwenden assertThat() Stil-Asserts, die alle Arten von Negationen leicht beschreiben und automatisch eine Beschreibung dessen erstellen können, was Sie erwartet haben und was Sie erhalten haben, wenn die Assertion fehlschlägt:

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

Alle drei Optionen sind gleichwertig, wählen Sie diejenige, die Sie am lesbarsten finden.

Um die einfachen Namen der Methoden zu verwenden (und diese angespannte Syntax funktionieren zu lassen), benötigen Sie diese Importe:

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

  • Ich schätze den Zeiger auf die alternative Behauptungssyntax, aber das Zeigen an anderer Stelle antwortet nicht warum JUnit wurde nie bereitgestellt assertNotEquals().

    – seh

    31. Mai 2010 um 14:30 Uhr

  • @seh: So wie ich es gelesen habe, ging es bei der Frage nicht um historisches Interesse, sondern um eine Möglichkeit, die Behauptung “diese beiden Objekte sind nicht gleich” in einem JUnit-Test zu formulieren. Das habe ich beantwortet. In Anbetracht des „Warum gibt/gab es keine assertNotEqual„Ich würde sagen, das liegt daran, dass es sich um eine spezialisierte Bestätigung handelt, die nicht so oft benötigt wird assertEquals und würde daher über das Generikum ausgedrückt werden assertFalse.

    – Joachim Sauer

    31. Mai 2010 um 14:34 Uhr

  • “Wählen Sie diejenige aus, die Sie am lesbarsten finden”. Leute, die Unit-Tests lesen und schreiben, sind Programmierer. Finden sie das wirklich besser lesbar als „asserNotEqual(objectUnderTest, someOtherObject)“ oder „asserFalse(objectUnderTest.equals(someOtherObject))“? Ich bin nicht von den ausgefallenen Matcher-APIs überzeugt – es scheint für einen Programmierer erheblich schwieriger zu sein, ihre Verwendung zu erforschen / zu entdecken …

    – Bakar

    8. Mai 2012 um 17:49 Uhr


  • @bacar: Manche behaupten, es sei im Grunde eine Frage des Stils. Aber assertThat ist viel ausdrucksstärker als die begrenzte Menge von assert* Methoden zur Verfügung. Daher können Sie die genauen Einschränkungen in einer einzigen Zeile ausdrücken, die sich (fast) wie ein englischer Satz lesen lässt und Erhalten Sie eine aussagekräftige Nachricht, wenn die Bestätigung fehlschlägt. Zugegeben, das ist nicht immer ein Killer-Feature, aber wenn Sie es ein paar Mal in Aktion gesehen haben, werden Sie sehen, wie viel Mehrwert es bringt.

    – Joachim Sauer

    9. Mai 2012 um 5:31 Uhr

  • @Joachim Dem stimme ich zu assertThat ist ausdrucksstärker als assert*aber ich glaube nicht, dass es ausdrucksstärker ist als der Java-Ausdruck, den Sie innerhalb und außerhalb von einfügen können assert* Ausdruck im Allgemeinen (schließlich kann ich alles in Java-Code ausdrücken). Es ist ein allgemeines Problem, auf das ich bei APIs im Fluent-Stil gestoßen bin – jede ist im Grunde eine neue DSL, die Sie lernen müssen (wenn wir alle die Java-API kennen!). Ich nehme an, Hamcrest ist jetzt allgegenwärtig genug, dass man vernünftigerweise erwarten kann, dass die Leute es wissen. Ich werde spielen …

    – Bakar

    9. Mai 2012 um 15:32 Uhr

Benutzer-Avatar
Stefan Birkner

Da ist ein assertNotEquals in 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;

  • Beachten Sie, dass eines der jmock (2.6.0)-Maven-Artefakte eine alte Version von junit-dep preisgibt, die wiederum eine Assert-Klasse ohne das assertNotEquals hat. Schließen Sie das besser aus, wenn Sie Efeu verwenden.

    – gkephorus

    1. Oktober 2014 um 8:47 Uhr

  • Ich verwende 4.12, kann aber assertNotEqual immer noch nicht finden. :s

    – Mubashar

    5. Mai 2015 um 5:17 Uhr

Benutzer-Avatar
Mikko Maunu

Ich frage mich genauso. Die API von Assert ist nicht sehr symmetrisch; zum Testen, ob Objekte gleich sind, bietet es assertSame und assertNotSame.

Natürlich ist es nicht zu lang, um zu schreiben:

assertFalse(foo.equals(bar));

Bei einer solchen Behauptung ist der einzige informative Teil der Ausgabe leider der Name der Testmethode, daher sollte die beschreibende Nachricht separat gebildet werden:

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

Das ist natürlich so mühsam, dass es besser ist, selbst zu rollen assertNotEqual. Zum Glück wird es in Zukunft vielleicht Teil der JUnit sein: JUnit-Ausgabe 22

  • Dies ist jedoch weniger nützlich, da JUnit keine hilfreiche Fehlermeldung generieren kann, die Ihnen beispielsweise die ungleichen Werte von foo und bar mitteilt. Der wahre Fehlergrund wird ausgeblendet und in einen einfachen booleschen Wert umgewandelt.

    – Ben James

    26. November 2010 um 11:31 Uhr


  • Ich bin vollkommen einverstanden. InsbesondereasserFalse benötigt das richtige Nachrichtenargument, um eine Ausgabe zu erzeugen, die sagt, was wirklich schief gelaufen ist.

    – Mikko Maunu

    21. Oktober 2011 um 9:27 Uhr


  • Ich denke, das ist nützlich für die Textpräsentationstests. Danke

    – Marouane Gazanayi

    6. März 2012 um 10:02 Uhr

  • Das Problem mit dem Text ist, dass er mit der Weiterentwicklung des Codes veraltet sein wird.

    – Mark Levison

    17. Dezember 2012 um 20:18 Uhr

Ich würde argumentieren, dass das Fehlen von assertNotEqual tatsächlich eine Asymmetrie ist und JUnit etwas weniger erlernbar macht. Beachten Sie, dass dies ein netter Fall ist, wenn das Hinzufügen einer Methode die Komplexität der API verringern würde, zumindest für mich: Symmetrie hilft, den größeren Raum zu beherrschen. Meine Vermutung ist, dass der Grund für die Auslassung darin liegen könnte, dass zu wenige Leute die Methode fordern. Ich erinnere mich jedoch an eine Zeit, als es nicht einmal assertFalse gab; daher habe ich eine positive Erwartung, dass die Methode eventuell hinzugefügt wird, da sie nicht schwierig ist; obwohl ich anerkenne, dass es zahlreiche Problemumgehungen gibt, sogar elegante.

Ich komme ziemlich spät zu dieser Party, aber ich habe festgestellt, dass das Formular:

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

kann für die meisten „ungleichen“ Fälle verwendet werden.

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

  • Das funktioniert zwar, aber das Problem ist, dass, wenn die Behauptung fehlschlägt, einfach „Erwartet wahr, aber falsch“ oder eine andere unklare Aussage steht. Was großartig wäre, wäre, wenn es nicht 123 erwartet, sondern 123 wäre.

    – Stealth-Rabbi

    3. Juni 2014 um 13:21 Uhr

Benutzer-Avatar
Akshay Vijay Jain

Ich arbeite an JUnit in einer Java 8-Umgebung und verwende jUnit4.12

für mich: Compiler konnte die Methode assertNotEquals nicht finden, selbst wenn ich sie verwendet habe
import org.junit.Assert;

Also habe ich gewechselt
assertNotEquals("addb", string);
zu
Assert.assertNotEquals("addb", string);

Wenn Sie also ein Problem bzgl assertNotEqual nicht erkannt, dann ändern Sie es in Assert.assertNotEquals(,); es sollte dein Problem lösen

  • Das funktioniert zwar, aber das Problem ist, dass, wenn die Behauptung fehlschlägt, einfach „Erwartet wahr, aber falsch“ oder eine andere unklare Aussage steht. Was großartig wäre, wäre, wenn es nicht 123 erwartet, sondern 123 wäre.

    – Stealth-Rabbi

    3. Juni 2014 um 13:21 Uhr

Benutzer-Avatar
Markus Levison

Der offensichtliche Grund, warum die Leute assertNotEquals() wollten, war, Builtins zu vergleichen, ohne sie zuerst in ausgewachsene Objekte konvertieren zu müssen:

Ausführliches Beispiel:

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

vs.

assertNotEqual(1, winningBidderId);

Da Eclipse JUnit 4.11 standardmäßig nicht enthält, müssen Sie leider ausführlich sein.

Vorbehalt Ich glaube nicht, dass die ‘1’ in eine Integer.valueOf() eingeschlossen werden muss, aber da ich neu von .NET zurückgekehrt bin, zählen Sie nicht auf meine Korrektheit.

1360910cookie-checkWarum bietet JUnit keine assertNotEquals-Methoden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy