AssertContains auf Strings in jUnit


186

Gibt es eine schönere Möglichkeit, in jUnit zu schreiben?

String x = "foo bar";
Assert.assertTrue(x.contains("foo"));

7
IMO das ist nett genug, vorgeschlagene Optionen sind weniger lesbar
The Godfather

3
@ TheGodfather ist weniger lesbar, führt aber zu aussagekräftigeren Assertionsfehlern (dh die akzeptierte Antwort zeigt den Unterschied in den Zeichenfolgen, wobei die OPs-Lösung bei einem Fehler nur "Falsch, wenn erwartet, wahr" anzeigt)
Mike

Was eine Behauptung "schöner" macht, ist die Fehlermeldung, wenn sie fehlschlägt. Wie lesbar es im Code ist, ist zweitrangig, da Sie den Code erst betrachten müssen, wenn er fehlschlägt, und die Fehlermeldung als erstes angezeigt wird.
rjmunro

Antworten:


289

Wenn Sie Hamcrest und JUnit4 hinzufügen, können Sie Folgendes tun:

String x = "foo bar";
Assert.assertThat(x, CoreMatchers.containsString("foo"));

Bei einigen statischen Importen sieht es viel besser aus:

assertThat(x, containsString("foo"));

Die erforderlichen statischen Importe wären:

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;

8
Stellen Sie sicher, dass Sie org.junit.AssertVersus verwenden junit.framework.Assert, da letzterer nicht über den Hamcrest MatcherassertThat()
Visionary Software Solutions verfügt.

15
Ich denke, wenn JUnit 4.10 ausgeführt wird, ist die zu verwendende Klasse org.junit.matchers.JUnitMatchers, zB: assertThat ("etwas", JUnitMatchers.containsString ("some"));
Ewen Cartwright

1
Die Fehlermeldung für einen Fehler assertThatist viel hilfreicher als einassertTrue
Mike Rylander

3
Statische Importe erforderlich sind import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;- nur um jemanden vor Ärger zu bewahren
Eis

4
... und org.hamcrest.Matchers.containsString;in der neuesten API, in der hamcrest-libraryAbhängigkeit.
Eis

12

benutze fest assert 2.0 wann immer möglich EDIT: assertj kann mehr Assertions haben (eine Gabelung)

assertThat(x).contains("foo");

Ich habe mit AssertJ.assertThat keine Includes-Methode gefunden. Dies ist, was ich stattdessen gefunden habe - org.assertj.core.api.Assertions.assertThat (convertException) .hasMessageContaining ("einige Teilzeichenfolgen");
Raj

Entschuldigung, ich denke, mein obiger Kommentar passt nicht zum Kontext dieser Antwort. Ich befand mich in einem anderen Anwendungsfall, in dem ich in einer Ausnahmemeldung nach einem Teilstring suchen muss.
Raj

8

Verwenden Sie Hamcrest Matcher containsString()

// Hamcrest assertion
assertThat(person.getName(), containsString("myName"));

// Error Message
java.lang.AssertionError:
Expected: a string containing "myName"
     got: "some other name"

Sie können optional eine noch detailliertere Fehlermeldung hinzufügen.

// Hamcrest assertion with custom error message
assertThat("my error message", person.getName(), containsString("myName"));

// Error Message
java.lang.AssertionError: my error message
Expected: a string containing "myName"
     got: "some other name"

Habe hier meine Antwort auf eine doppelte Frage gepostet



3

Es ist zu spät, aber nur um es zu aktualisieren, habe ich es mit der folgenden Syntax erledigt

import org.hamcrest.core.StringContains;
import org.junit.Assert;

Assert.assertThat("this contains test", StringContains.containsString("test"));

2

Eine andere Variante ist

Assert.assertThat(actual, new Matches(expectedRegex));

Außerdem in org.mockito.internal.matcherses gibt einige andere interessante Matcher, wie StartWith, Containsusw.


0

assertj Variante

import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);

0

Beispiel (Junit-Version 4.13)

import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;

public class TestStr {

@Test
public void testThatStringIsContained(){
    String testStr = "hi,i am a test string";
    assertThat(testStr).contains("test");
 }

}

-1

Ich habe auf dieser Seite viele Antworten ausprobiert, keine hat wirklich funktioniert:

  • org.hamcrest.CoreMatchers.containsString wird nicht kompiliert, Methode kann nicht aufgelöst werden.
  • JUnitMatchers.containsString ist nicht verfügbar (und verweist auf CoreMatchers.containsString ).
  • org.hamcrest.Matchers.containsString : NoSuchMethodError

Anstatt lesbaren Code zu schreiben, habe ich mich stattdessen für den in der Frage erwähnten einfachen und praktikablen Ansatz entschieden.

Hoffentlich kommt eine andere Lösung.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.