it-swarm.com.de

Wie kann ich einen tatsächlichen Wert gegen zwei oder mehr erwartete Werte geltend machen?

Ich teste eine Methode, um zu sehen, ob sie die korrekte Zeichenfolge zurückgibt. Diese Zeichenfolge besteht aus einer Vielzahl von Zeilen, deren Reihenfolge sich ändern kann, sodass normalerweise zwei mögliche Kombinationen möglich sind. Diese Reihenfolge ist für meine Bewerbung nicht wichtig.

Da sich jedoch die Reihenfolge der Zeilen ändern kann, funktioniert das Schreiben einer Assert-Anweisung nicht, da sie manchmal den Test bestehen und manchmal den Test nicht besteht.

Ist es also möglich, einen Test zu schreiben, der einen tatsächlichen String-Wert gegen zwei oder mehr erwartete String-Werte aussagt und prüft, ob er einem von ihnen entspricht?

21
Andrei

Verwenden des Hamcrest CoreMatcher (in JUnit 4.4 und höher enthalten) und assertThat():

assertThat(myString, anyOf(is("value1"), is("value2"));
39
Joachim Sauer

Ich würde AssertJ dafür verwenden:

assertThat("hello").isIn("hello", "world");

Es ist prägnanter und gibt Ihnen eine beschreibende Nachricht, wenn die Assertion fehlschlägt.

17
Jonathan

Sie können Hamcrest dafür verwenden:

assertThat(testString, anyOf(
    containsString("My first string"), 
    containsString("My other string")));

(Ich sehe, dass Joachim gerade sehr ähnlich geantwortet hat (+1) ... ich werde dies als weiteres Beispiel hinzufügen.)

6
alpian

Erwägen Sie, einen benutzerdefinierten Hamcrest-Matcher zu schreiben, der von einer Methode zurückgegeben wird, in diesem Fall containsOneOf, d. H .:

assertThat(myString, containsOneOf("value1", "value2"));

In Übereinstimmung mit den "xUnit-Mustern" sollten Sie bedingte Logik in Ihrem Matcher vermeiden. Eine Schleife mit einer break-Anweisung sollte ausreichen.

Weitere Informationen finden Sie in Hamcrest und xUnit Patterns .

2
murungu

Ich lese alle Antworten, aber die, die mir am kompaktesten und ausdrucksvollsten erscheint, ist die Verwendung von Hamcrests isOneOf, die bereits in JUnit enthalten ist

assertThat(result, isOneOf("value1", "value2"));

dadurch erhalten Sie eine Nizza-Fehlermeldung, wenn ein Fehler auftritt.

Java.lang.AssertionError: 
Expected: one of {"value1", "value2"}
     but: was "value"
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.Java:20)
[...]
2
fglez

Ich verwende Folgendes, ich hoffe, das würde helfen: 

String expectedTitles[] = {"Expected1","Expected2"};
List<String> expectedTitlesList = Arrays.asList(expectedTitles);

assertTrue(expectedTitlesList.contains((actualTitle)));
1
Barun Kumar

Das einfachste/effizienteste könnte sein

assert str.equals(result1) || str.equals(result2);

Dies hat praktisch keinen Overhead, wenn Sie keine Assertions aktiviert haben.

1
Peter Lawrey

Wenn der Inhalt einer Zeile festgelegt ist, können Sie ihn an den Zeilenenden aufteilen, bevor Sie ihn vergleichen. Dann vergleichen Sie einfach jede Zeile mit einem Satz von erwarteten Werten.

   Set<String> expectedValues = ...
   String[] split = text.split("\n");
   for(String str : split) {
      assert(expectedValues.contains(str));
   }

Wenn Sie überprüfen möchten, dass alle erwarteten Werte vorhanden sind, können Sie expectedValue.remove(str) == true und nach der Schleife bestätigen, dass das Set leer ist. Wenn einige Zeilen mehrfach vorkommen, müssen Sie anstelle eines Sets einen Beutel verwenden.

1
joe776

Wenn Sie mit junit arbeiten, würde ich Folgendes tun:

assertTrue(myString.equals("Value1") || myString.equals("Value"));
1
Tom Jefferys

Ich denke, Sie können nur assertTrue verwenden:

assertTrue(testString.matches("string1|string2"));

0
OSrookie

Unter der Annahme, dass die zu testende Methode ein Array zurückgibt, könnten Sie mit Hamcrests arrayContainingInAnyOrder testen.

assertThat(result, is(arrayContainingInAnyOrder("value1", "value2", "value")))

Hinweis: Die Verwendung von is-Wrapper ist rein optional und wird nur als lesbarer Zucker verwendet.

0
Chris Willmore

Es ist ein alter Beitrag, aber ich wollte eine native einfache Antwort haben, ohne zusätzliche Bibliotheken hinzufügen zu müssen. :)

So tat ich : 

String e
e = "ear"
j = "jars"

assert (j == "jar" || e == "ear")

oder wenn Sie möchten, dass beide wahr sind

assert (j == "jar" && e == "ear")
0
Marmelin