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"));
ripper234
quelle
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;
Yishai
quelle
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");
Piotrek
quelle
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

Mike Rylander
quelle
4

Verwenden Sie die neue assertThatSyntax zusammen mit Hamcrest .

Es ist ab JUnit 4.4 verfügbar .

Robert Munteanu
quelle
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"));
rns
quelle
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.

LEON DENIS
quelle
0

assertj Variante

import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);
Lazarenko Alex
quelle
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");
 }

}
Muriithi Derrick
quelle
-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.

P Kuijpers
quelle