Afirmar coincidencias de expresiones regulares en JUnit

3 minutos de lectura

de rubí Test::Unit tiene un bonito assert_matches método que se puede usar en pruebas unitarias para afirmar que una expresión regular coincide con una cadena.

¿Hay algo así en JUnit? Actualmente, hago esto:

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

avatar de usuario
fósil

Si utiliza assertThat() con un emparejador Hamcrest que prueba las coincidencias de expresiones regulares, luego, si la afirmación falla, recibirá un buen mensaje que indica el patrón esperado y el texto real. La afirmación se leerá con más fluidez también, por ejemplo

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

con Hamcrest 2 puedes encontrar un matchesPattern método en MatchesPattern.matchesPattern.

avatar de usuario
Miguel

No hay otra opción que yo sepa. Acabo de comprobar el afirmar javadoc para estar seguro. Sin embargo, solo un pequeño cambio:

assertTrue(actual.matches(expectedRegex));

EDITAR: he estado usando los emparejadores de Hamcrest desde la respuesta de pholser, ¡compruébalo también!

  • Ah, sí, assertTrue() definitivamente es mejor. Culpo al autocompletado de Eclipse por no saberlo. 😉

    –Josh Glover

    14 de diciembre de 2011 a las 13:31

  • assertTrue No puedo darte tantos detalles como assertEquals o assertThat cuando falla una prueba

    – Mike Valenty

    12 de julio de 2012 a las 17:02


  • @Michael Claro que puede. assertTrue("Expected string matching '" +expectedRegex+ "'. Got: "+actual, actual.matches(expectedRegex));. Sin embargo, no es tan agradable como Hamcrest.

    – MikeFHay

    24/09/2013 a las 10:57


  • @MikeValenty Si solo está comparando un valor con is(true)después assertThat no te da más detalles que assertTrue lo hace. Para obtener los mensajes de error correctos, necesita un comparador diferente (o construye el mensaje manualmente como sugirió @MikeFHay).

    – ThrawnCA

    12 de junio de 2017 a las 5:32

  • Importante: string.matches() está disponible a partir de la versión 8 de java y en esa versión no soporta multilínea, ni siquiera usando la bandera respectiva (?m); entonces tendría que hacerlo de la manera detallada anterior: Pattern.compile() luego matcher.find()

    –Ismael Sarmiento

    4 de agosto de 2021 a las 16:07

Puedes usar Hamcrest, pero tienes que escribir tu propio comparador:

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

uso

import org.junit.Assert;


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

avatar de usuario
yegor256

Puedes usar Hamcrest y jcabi-matchers:

import static com.jcabi.matchers.RegexMatchers.matchesPattern;
import static org.junit.Assert.assertThat;
assertThat("test", matchesPattern("[a-z]+"));

Más detalles aquí: Coincidencias Hamcrest de expresiones regulares.

Necesitará estas dos dependencias en 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>

Como también estaba buscando esta funcionalidad, comencé un proyecto en GitHub llamado probador de expresiones regulares. Es una biblioteca que ayuda a facilitar la prueba de expresiones regulares en Java (actualmente solo funciona con JUnit).

La biblioteca es muy limitada en este momento, pero tiene un comparador de Hamcrest que funciona así

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

Más información sobre cómo usar regex-tester es aquí.

avatar de usuario
Nick A. vatios

Un emparejador similar a la implementación de Ralph ha sido adicional a la biblioteca oficial de emparejadores de Java Hamcrest. Desafortunadamente, aún no está disponible en un paquete de lanzamiento. la clase esta en GitHub aunque si quieres echar un vistazo.

avatar de usuario
abe

otra alternativa usando assertj. este enfoque es bueno ya que le permite pasar el objeto de patrón directamente.

import static org.assertj.core.api.Assertions.assertThat;
assertThat("my\nmultiline\nstring").matches(Pattern.compile("(?s)my.*string", Pattern.MULTILINE));

¿Ha sido útil esta solución?