web-dev-qa-db-fra.com

Affirmez les correspondances d'expression régulière dans JUnit

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));
68
Josh Glover

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

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!

46
Miquel

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

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>
17
yegor256

Un matcher similaire à l'implémentation de Ralph a été ajouté à la bibliothèque officielle Java Hamcrest matchers. Malheureusement, il n'est pas encore disponible dans un package de version. La classe est activée - GitHub si vous voulez voir.

4
Nick A. Watts

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 .

4
Nick A. Watts

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]+$"));
3
gavenkoa

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));
2
abe


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);
1
boly38