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));
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
.
-
Hamcrest 2.0 tiene la
Matchers.matchesPattern(String)
ahora integrado: github.com/hamcrest/JavaHamcrest/blob/master/hamcrest-library/…– hinneEnlaces
7 de marzo de 2016 a las 9:21
-
Enlace permanente a lo que se refiere @hinneLinks: github.com/hamcrest/JavaHamcrest/blob/…
– pioto
20 de febrero de 2017 a las 21:47
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 comoassertEquals
oassertThat
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ésassertThat
no te da más detalles queassertTrue
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");
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í.
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.
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));