Утверждение регулярных выражений матчей в JUnit
Рубин Test::Unit
приятный assert_matches
метод, который может использоваться в модульных тестов, чтобы утверждать, что регулярное выражение соответствует строке.
есть ли что-нибудь подобное в JUnit? В настоящее время я делаю это:
assertEquals(true, actual.matches(expectedRegex));
9 ответов:
Если вы используете
assertThat()
С Hamcrest matcher что тесты для регулярных выражений совпадений, то если утверждение не удается, вы получите хорошее сообщение, которое указывает на ожидаемый шаблон и фактический текст. Утверждение также будет читаться более свободно, напримерassertThat("FooBarBaz", matchesPattern("^Foo"));
нет другого выбора, который я знаю. Только что проверил assert javadoc чтобы быть уверенным. Просто небольшое изменение, хотя:
assertTrue(actual.matches(expectedRegex));
EDIT: я использую Hamcrest matchers с момента ответа pholser, проверьте это тоже!
Вы можете использовать Hamcrest, но вы должны написать свой собственный совпадений:
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); } }
использование
import org.junit.Assert; Assert.assertThat("test", RegexMatcher.matchesRegex(".*est");
Вы можете использовать Hamcrest и jcabi-matchers:
import static com.jcabi.matchers.RegexMatchers.matchesPattern; import static org.junit.Assert.assertThat; assertThat("test", matchesPattern("[a-z]+"));
подробности здесь: Регулярное Выражение Hamcrest Matchers.
вам понадобятся эти две зависимости в 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>
поскольку я также искал эту функциональность, я начал проект на GitHub под названием regex-tester. Это библиотека, которая помогает облегчить тестирование регулярных выражений в Java (в настоящее время работает только с JUnit).
библиотека очень ограничена прямо сейчас, но у нее есть Hamcrest matcher, который работает так
assertThat("test", doesMatchRegex("tes.+")); assertThat("test", doesNotMatchRegex("tex.+"));
подробнее о том, как использовать regex-tester is здесь.
это не JUnit, но вот еще один способ с fest-assert:assertThat(myTestedValue).as("your value is so so bad").matches(expectedRegex);
еще одна альтернатива с помощью assertj. этот подход хорош тем, что позволяет передавать объект pattern напрямую.
import static org.assertj.core.api.Assertions.assertThat; assertThat("my\nmultiline\nstring").matches(Pattern.compile("(?s)my.*string", Pattern.MULTILINE));
в Hamcrest есть соответствующий matcher:орг.hamcrest.Первомайскую.matchesPattern (string regex).
как развитие Hamcrest застопорилось вы не можете использовать последнюю доступную версию v1. 3:
testCompile("org.hamcrest:hamcrest-library:1.3")
вместо этого вам нужно использовать новые серии dev (но все же датировано янв 2015):
testCompile("org.hamcrest:java-hamcrest:2.0.0.0")
или еще лучше:
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") }
тест:
Assert.assertThat("123456", Matchers.matchesPattern("^[0-9]+$"));