AssertContains su stringhe in jUnit


187

C'è un modo migliore per scrivere in jUnit

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

7
Questo è abbastanza carino, le opzioni suggerite sono meno leggibili
Il Padrino,

3
@TheGodfather è meno leggibile, ma produce errori di asserzione più significativi (ovvero, la risposta accettata mostrerà la differenza nelle stringhe, dove la soluzione OP mostrerà semplicemente "False quando previsto True" in caso di fallimento)
Mike

Ciò che rende un'affermazione "più bella" è il messaggio di errore quando fallisce. Quanto sia leggibile nel codice è secondario a quello, perché non devi guardare il codice fino a quando non fallisce, e il messaggio di errore è la prima cosa che vedi.
rjmunro,

Risposte:


291

Se aggiungi Hamcrest e JUnit4, puoi fare:

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

Con alcune importazioni statiche, sembra molto meglio:

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

Le importazioni statiche necessarie sarebbero:

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

8
Assicurati di utilizzare org.junit.Assertcontro junit.framework.Assert, poiché quest'ultimo non ha Hamcrest MatcherassertThat()
Visionary Software Solutions

15
Penso che quando si esegue JUnit 4.10, la classe da utilizzare è org.junit.matchers.JUnitMatchers, ad esempio: assertThat ("qualcosa", JUnitMatchers.containsString ("some"));
Ewen Cartwright,

1
Il messaggio di fallimento per un fallimento assertThatè molto più utile di unassertTrue
Mike Rylander

3
Le importazioni statiche necessarie sono import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;- solo per salvare qualcuno dai guai
eis

4
... e org.hamcrest.Matchers.containsString;nell'ultima API, nella hamcrest-librarydipendenza.
eis,

13

usa fest assert 2.0 quando possibile EDIT: assertj può avere più asserzioni (un fork)

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

Non ho trovato un metodo contiene con AssertJ.assertThat. Questo è quello che ho trovato invece - org.assertj.core.api.Assertions.assertThat (conversionException) .hasMessageContain ("some substring");
Raj,

scusate, penso che il mio commento sopra non si adatti al contesto di questa risposta. Ero in un caso d'uso diverso in cui ho bisogno di verificare una sottostringa all'interno di un messaggio di eccezione.
Raj,

8

Usa Hamcrest Matcher containsString()

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

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

Puoi facoltativamente aggiungere un messaggio di errore ancora più dettagliato.

// 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"

Ho pubblicato la mia risposta a una domanda duplicata qui



3

È troppo tardi, ma solo per aggiornarlo l'ho fatto con la sintassi seguente

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

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

2

Un'altra variante è

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

Inoltre org.mockito.internal.matchersci sono alcuni altri abbinamenti interessanti, come StartWith, Containsecc.


0

variante assertj

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

0

Esempio (versione junit- 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

Ho provato molte risposte su questa pagina, nessuna ha funzionato davvero:

  • org.hamcrest.CoreMatchers.containsString non viene compilato, impossibile risolvere il metodo.
  • JUnitMatchers.containsString è deprecato (e si riferisce a CoreMatchers.containsString ).
  • org.hamcrest.Matchers.containsString : NoSuchMethodError

Quindi, invece di scrivere un codice leggibile, ho deciso di utilizzare invece l'approccio semplice e praticabile menzionato nella domanda.

Speriamo che arrivi un'altra soluzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.