Ruby Test::Unit
a une belle assert_matches
méthode qui peut être utilisée dans les tests unitaires pour affirmer qu'une expression régulière correspond à une chaîne.
Y a-t-il quelque chose comme ça dans JUnit? Actuellement, je fais ceci:
assertEquals(true, actual.matches(expectedRegex));
Si vous utilisez assertThat()
avec un Hamcrest matcher qui teste les correspondances d'expression régulière, alors si l'assertion échoue, vous obtiendrez un joli message qui indique le motif attendu et le texte réel. L'affirmation sera également lue plus couramment, par exemple.
assertThat("FooBarBaz", matchesPattern("^Foo"));
Aucun autre choix que je connaisse. Juste vérifié le assert javadoc pour être sûr. Juste un tout petit changement, cependant:
assertTrue(actual.matches(expectedRegex));
EDIT: J'utilise les matchers Hamcrest depuis la réponse de pholser, vérifiez cela aussi!
Vous pouvez utiliser Hamcrest, mais vous devez écrire votre propre matcher:
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);
}
}
usage
import org.junit.Assert;
Assert.assertThat("test", RegexMatcher.matchesRegex(".*est");
Vous pouvez utiliser Hamcrest et jcabi-matchers :
import static com.jcabi.matchers.RegexMatchers.matchesPattern;
import static org.junit.Assert.assertThat;
assertThat("test", matchesPattern("[a-z]+"));
Plus de détails ici: Matchers Hamcrest Expression régulière .
Vous aurez besoin de ces deux dépendances dans classpath:
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jcabi</groupId>
<artifactId>jcabi-matchers</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
Parce que je cherchais également cette fonctionnalité, j'ai lancé un projet sur GitHub appelé regex-tester . Il s'agit d'une bibliothèque qui facilite le test des expressions régulières dans Java (ne fonctionne qu'avec JUnit actuellement).
La bibliothèque est très limitée en ce moment, mais elle a un matcher Hamcrest qui fonctionne comme ça
assertThat("test", doesMatchRegex("tes.+"));
assertThat("test", doesNotMatchRegex("tex.+"));
En savoir plus sur l'utilisation du testeur d'expressions régulières est ici .
Il y a une correspondance correspondante dans Hamcrest: org.hamcrest.Matchers.matchesPattern (String regex) .
Le développement de Hamcrest étant au point mort vous ne pouvez pas utiliser la dernière version 1.3 disponible:
testCompile("org.hamcrest:hamcrest-library:1.3")
Au lieu de cela, vous devez utiliser une nouvelle série de dev (mais toujours daté de janvier 2015 ):
testCompile("org.hamcrest:Java-hamcrest:2.0.0.0")
ou encore mieux:
configurations {
testCompile.exclude group: "org.hamcrest", module: "hamcrest-core"
testCompile.exclude group: "org.hamcrest", module: "hamcrest-library"
}
dependencies {
testCompile("org.hamcrest:hamcrest-junit:2.0.0.0")
}
En test:
Assert.assertThat("123456", Matchers.matchesPattern("^[0-9]+$"));
une autre alternative utilisant assertj. cette approche est agréable car elle vous permet de passer directement l'objet motif.
import static org.assertj.core.api.Assertions.assertThat;
assertThat("my\nmultiline\nstring").matches(Pattern.compile("(?s)my.*string", Pattern.MULTILINE));
ce n'est pas JUnit mais voici une autre façon avec fest-assert:
assertThat(myTestedValue).as("your value is so so bad").matches(expectedRegex);