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"));

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;

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");

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



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"));

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.


0

variante assertj

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

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

}

-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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.