AssertContains sur les chaînes dans jUnit

187

Y a-t-il une meilleure façon d'écrire dans jUnit

String x = "foo bar";
Assert.assertTrue(x.contains("foo"));
ripper234
la source
7
OMI, c'est assez sympa, les options suggérées sont moins lisibles
The Godfather
3
@TheGodfather moins lisible, mais produit des erreurs d'assertion plus significatives (c'est-à-dire que la réponse acceptée montrera la différence dans les chaînes, alors que la solution OPs affichera simplement "False when expected True" en cas d'échec)
Mike
Ce qui rend une affirmation "plus agréable", c'est le message d'erreur en cas d'échec. La lisibilité du code est secondaire à cela, car vous n'avez pas à regarder le code jusqu'à ce qu'il échoue, et le message d'échec est la première chose que vous voyez.
rjmunro

Réponses:

291

Si vous ajoutez Hamcrest et JUnit4, vous pouvez faire:

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

Avec quelques importations statiques, cela a l'air beaucoup mieux:

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

Les importations statiques nécessaires seraient:

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;
Yishai
la source
8
Assurez-vous que vous utilisez org.junit.Assertversus junit.framework.Assert, car ce dernier n'a pas le Hamcrest MatcherassertThat()
Visionary Software Solutions
15
Je pense que lors de l'exécution de JUnit 4.10, la classe à utiliser est org.junit.matchers.JUnitMatchers, par exemple: assertThat ("quelque chose", JUnitMatchers.containsString ("certains"));
Ewen Cartwright
1
Le message d'échec pour un échec assertThatest bien plus utile qu'unassertTrue
Mike Rylander
3
les importations statiques nécessaires sont import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;- juste pour sauver quelqu'un de la difficulté
eis
4
... et org.hamcrest.Matchers.containsString;dans la dernière api, dans la hamcrest-librarydépendance.
eis
13

utilisez fest assert 2.0 autant que possible EDIT: assertj peut avoir plus d'assertions (un fork)

assertThat(x).contains("foo");
piotrek
la source
Je n'ai pas trouvé de méthode contient avec AssertJ.assertThat. C'est ce que j'ai trouvé à la place - org.assertj.core.api.Assertions.assertThat (conversionException) .hasMessageContaining ("some substring");
Raj
désolé, je pense que mon commentaire ci-dessus ne convient pas au contexte de cette réponse. J'étais sur un cas d'utilisation différent où je dois vérifier une sous-chaîne dans un message d'exception.
Raj
8

Utilisez Hamcrest Matcher containsString()

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

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

Vous pouvez facultativement ajouter un message d'erreur encore plus détaillé.

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

J'ai publié ma réponse à une question en double ici

Mike Rylander
la source
5

Utilisez la nouvelle assertThatsyntaxe avec Hamcrest .

Il est disponible à partir de JUnit 4.4 .

Robert Munteanu
la source
3

Il est trop tard, mais juste pour mettre à jour, je l'ai fait avec la syntaxe ci-dessous

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

Assert.assertThat("this contains test", StringContains.containsString("test"));
rns
la source
2

Une autre variante est

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

De plus, org.mockito.internal.matchersil y a d'autres matchers intéressants, comme StartWith, Containsetc.

LEON DENIS
la source
0

variante assertj

import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);
Lazarenko Alex
la source
0

Exemple (version 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");
 }

}
Muriithi Derrick
la source
-1

J'ai essayé de nombreuses réponses sur cette page, aucune n'a vraiment fonctionné:

  • org.hamcrest.CoreMatchers.containsString ne compile pas, ne peut pas résoudre la méthode.
  • JUnitMatchers.containsString est déprécié (et fait référence à CoreMatchers.containsString ).
  • org.hamcrest.Matchers.containsString : NoSuchMethodError

Donc, au lieu d'écrire du code lisible, j'ai décidé d'utiliser plutôt l'approche simple et réalisable mentionnée dans la question.

Espérons qu'une autre solution se présentera.

P Kuijpers
la source