91 votes

Assert regex matches dans JUnit

Ruby's Test::Unit a une belle assert_matches qui peut être utilisée dans les tests unitaires pour affirmer qu'une expression rationnelle correspond à une chaîne de caractères.

Y a-t-il quelque chose de semblable dans JUnit ? Actuellement, je fais ceci :

assertEquals(true, actual.matches(expectedRegex));

105voto

pholser Points 1928

Si vous utilisez assertThat() avec un Matrice de Hamcrest qui teste les correspondances regex, et si l'assertion échoue, vous obtiendrez un beau message qui indique le modèle attendu et le texte réel. La lecture de l'assertion sera également plus fluide, par ex.

assertThat("FooBarBaz", matchesPattern("^Foo"));

avec Hamcrest 2, vous pouvez trouver un matchesPattern méthode à MatchesPattern.matchesPattern .

21 votes

Hamcrest 2.0 a le Matchers.matchesPattern(String) maintenant intégré : github.com/hamcrest/JavaHamcrest/blob/master/hamcrest-library/

5 votes

Permalink pour ce à quoi @hinneLinks fait référence : github.com/hamcrest/JavaHamcrest/blob/

54voto

Miquel Points 7036

Pas d'autre choix à ma connaissance. Je viens de vérifier le assert javadoc pour être sûr. Juste un tout petit changement, cependant :

assertTrue(actual.matches(expectedRegex));

EDIT : J'utilise les matchers de Hamcrest depuis la réponse de pholser, regardez ça aussi !

1 votes

Ah oui, assertTrue() est définitivement plus agréable. C'est à cause de l'auto-complétion d'Eclipse que je ne le savais pas ;)

4 votes

assertTrue ne peut pas vous donner autant de détails que assertEquals ou assertThat quand un test échoue

1 votes

@Michael Bien sûr que c'est possible. assertTrue("Expected string matching '" +expectedRegex+ "'. Got: "+actual, actual.matches(expectedRegex)); . Ce n'est pas aussi bien que Hamcrest cependant.

21voto

Ralph Points 42744

Vous pouvez utiliser Hamcrest, mais vous devez écrire votre propre matcheur :

public class RegexMatcher extends TypeSafeMatcher<String> {

    private final String regex;

    public RegexMatcher(final String regex) {
        this.regex = regex;
    }

    @Override
    public void describeTo(final Description description) {
        description.appendText("matches regex=`" + regex + "`");
    }

    @Override
    public boolean matchesSafely(final String string) {
        return string.matches(regex);
    }

    public static RegexMatcher matchesRegex(final String regex) {
        return new RegexMatcher(regex);
    }
}

utilisation

import org.junit.Assert;

Assert.assertThat("test", RegexMatcher.matchesRegex(".*est");

4voto

Nick A. Watts Points 68

Parce que j'étais également à la recherche de cette fonctionnalité, j'ai lancé un projet sur GitHub appelé testeur de regex . Il s'agit d'une bibliothèque qui facilite le test des expressions régulières en Java (ne fonctionne qu'avec JUnit actuellement).

La bibliothèque est très limitée pour l'instant, mais elle dispose d'un matcheur Hamcrest qui fonctionne de la manière suivante

assertThat("test", doesMatchRegex("tes.+"));
assertThat("test", doesNotMatchRegex("tex.+"));

Pour en savoir plus sur l'utilisation de regex-tester, voir ici .

4voto

Nick A. Watts Points 68

Un matcheur similaire à l'implémentation de Ralph a été mis en place. ajouté à la bibliothèque officielle Java Hamcrest Matchers. Malheureusement, elle n'est pas encore disponible dans un package de sortie. La classe se trouve sur GitHub si vous voulez y jeter un coup d'oeil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X