2009-07-08 12 views
383

Weiß jemand, warum JUnit 4 bietet assertEquals(foo,bar) aber nicht Methoden?Warum bietet JUnit assertNotEquals-Methoden nicht an?

Es bietet assertNotSame (entsprechend assertSame) und assertFalse (entsprechend assertTrue), so scheint es seltsam, dass sie nicht assertNotEqual einschließlich störten.

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

Antwort

376

Ich würde vorschlagen, Sie verwenden die neuere Stil behauptet, die leicht alle Arten von Negationen beschreiben kann und automatisch eine Beschreibung von dem, was Sie erwartet und was Sie haben Wenn die Assertion fehlschlägt:

Alle drei Optionen sind äquivalent, wählen Sie die, die Sie am besten finden.

zu den einfachen Namen der Methoden verwenden (und lassen diese angespannte Syntax arbeiten), können Sie diese Importe benötigen:

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

Ich schätze den Zeiger auf die alternative Assertionssyntax, aber anderswo zu zeigen, antwortet nicht * warum * JUnit hat 'assertNotEquals()' nie geliefert. – seh

+14

@seh: So wie ich es gelesen habe, ging es nicht um historisches Interesse, sondern um einen Weg, die Behauptung "diese beiden Objekte sind nicht gleich" in einem JUnit-Test zu formulieren. Ich habe das geantwortet.In Anbetracht des "Warum ist/gab es kein' assertNotEqual' "würde ich sagen, das liegt daran, dass es eine spezialisierte Behauptung ist, die nicht so oft benötigt wird wie' assertEquals' und daher über die generische 'assertFalse' ausgedrückt würde. –

+10

importieren Sie auch static org.junit.Assert.assertThat; –

47

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

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

assertFalse(foo.equals(bar)); 

Mit einer solchen Behauptung, das nur informativen Teil der Ausgabe leider der Name des Testverfahrens ist, sollte so beschreibende Nachricht separat gebildet werden :

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

das so langweilig ist natürlich, dass es besser ist, Ihre eigenen assertNotEqual zu rollen. Zum Glück in Zukunft wird es vielleicht Teil der JUnit sein: JUnit issue 22

+19

Dies ist jedoch weniger nützlich, weil JUnit keine hilfreiche Fehlermeldung generieren kann, die Ihnen beispielsweise die ungleichen Werte von foo und bar angibt. Der tatsächliche Fehlergrund wird ausgeblendet und in einen einfachen booleschen Wert umgewandelt. –

+3

stimme ich voll und ganz zu. Insbesondere assertFalse benötigt ein entsprechendes Argument, um eine Ausgabe zu erzeugen, die anzeigt, was wirklich schief gelaufen ist. –

+0

Ich denke, das ist nützlich für die Texttests. Thnx –

1

Es ist besser, die hamcrest für negative Aussagen zu verwenden, anstatt assertFalse wie in der ehemaligen Der Testbericht zeigt einen Diff für den Assertionsfehler.

Wenn Sie assertFalse verwenden, erhalten Sie nur einen Assertionsfehler im Bericht. d.h. verlorene Information über die Ursache des Fehlers.

12

Ich würde argumentieren, dass die Abwesenheit von assertNotEqual tatsächlich eine Asymmetrie ist und macht JUnit ein bisschen weniger erlernbar. Beachten Sie, dass dies ein schöner 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 möglicherweise darin besteht, dass zu wenige Leute nach der Methode rufen. Aber ich erinnere mich an eine Zeit, als sogar behaupten, dass False nicht existierte; daher habe ich eine positive Erwartung, dass die Methode eventuell hinzugefügt wird, da sie nicht schwierig ist; obwohl ich anerkenne, dass es viele Workarounds gibt, sogar elegante.

6

ich komme ziemlich spät zu dieser Party, aber ich habe die Form gefunden:

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

kann gemacht werden, für die meisten ‚nicht equals‘ Fälle zu arbeiten.

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

Während dies funktioniert, ist das Problem, dass, wenn die Assertion fehlschlägt, es wird einfach sagen" wurde wahr, aber war falsch "oder eine andere unklare Aussage. Was wäre toll, wenn es erwartet wurde, nicht 123, sondern war 123. –

133

Es gibt eine 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; 
+0

Ich sehe sogar AssertNotSame() in Junit 4.12-Beta2. – Tirumudi

+1

Eines der jmock (2.6.0) maven Artefakte gibt eine alte Version von junit-dep frei, die wiederum eine Assert-Klasse ohne die assertNotEquals enthält. Schließen Sie das besser aus, wenn Sie Efeu benutzen. – gkephorus

+3

Ich benutze 4.12, bin aber immer noch nicht in der Lage, assertNotEqual zu finden. : s –

3

Der offensichtliche Grund, dass die Menschen assertNotEquals() wollte, war builtins zu vergleichen, ohne sie zu ausgewachsenen Objekte zu konvertieren, die erste:

Ausführliches Beispiel:

vs.

assertNotEqual(1, winningBidderId); 

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

Vorbehalt Ich glaube nicht, dass die '1' in ein Integer.valueOf() gewickelt werden muss, aber da ich neu von .NET zurückgegeben werde, zähle nicht auf meine Richtigkeit.

-2

Modulo API Konsistenz, warum JUnit nicht assertNotEquals() vorsah der gleiche Grund, warum JUnit nie

wie Methoden zur Verfügung gestellt
  • assertStringMatchesTheRegex(regex, str) gegen assertStringDoesntMatchTheRegex(regex, str)
  • assertStringBeginsWith(prefix, str) gegen assertStringDoesntBeginWith(prefix, str)

dh es gibt Kein Ende der Bereitstellung einer spezifischen Assertion Methoden für die Arten von Dingen, die Sie in Ihrer Assertion Logik wollen!

Weit besser zusammensetzbare Test Primitiven wie equalTo(...), is(...), not(...), regex(...) zu schaffen und den Programmierer Stück diejenigen zusammen, anstatt für mehr Lesbarkeit und geistige Gesundheit lassen.

+3

Nun, aus irgendeinem Grund gibt es assertEquals(). Es musste nicht, aber es tut es. Die Frage war die fehlende Symmetrie - warum existiert assertEquals, aber nicht sein Gegenstück? – foo

3

Ich arbeite an JUnit in Java-8-Umgebung, mit jUnit4.12

für mich: Compiler nicht in der Lage war, die Methode assertNotEquals zu finden, auch wenn ich
import org.junit.Assert;

verwenden Also änderte ich
assertNotEquals("addb", string);
zu
Assert.assertNotEquals("addb", string);

Also, wenn Sie Problem konfrontiert sind, in Bezug auf assertNotEqual nicht erkannt wird, es dann zuändernsollte Ihr Problem lösen

+1

Das liegt daran, dass die Methoden statisch sind und Sie sie statisch importieren müssen. Verwenden Sie dieses 'import static org.junit.Assert. *;' Und Sie können alle Behauptungen ohne den Klassennamen verwenden. –

Verwandte Themen