Соответствовать регулярному выражению в JUnit
Ruby Test::Unit
имеет хороший метод assert_matches
, который можно использовать в модульных тестах, чтобы утверждать, что регулярное выражение соответствует строке.
В JUnit есть что-то подобное? В настоящее время я делаю это:
assertEquals(true, actual.matches(expectedRegex));
Ответы
Ответ 1
Если вы используете assertThat()
с совпадением Hamcrest, который проверяет соответствие регулярных выражений, то если утверждение не будет выполнено, вы получите хорошее сообщение, которое указывает ожидаемый шаблон и фактический текст. Утверждение будет читаться более свободно, например,
assertThat("FooBarBaz", matchesPattern("^Foo"));
Ответ 2
Нет другого выбора, который я знаю. Просто проверьте assert javadoc.
Просто небольшое изменение:
assertTrue(actual.matches(expectedRegex));
ИЗМЕНИТЬ: Я использую совпадения Hamcrest, так как pholser отвечает, проверьте это тоже!
Ответ 3
Вы можете использовать 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");
Ответ 4
Вы можете использовать Hamcrest и jcabi-matchers:
import static com.jcabi.matchers.RegexMatchers.matchesPattern;
import static org.junit.Assert.assertThat;
assertThat("test", matchesPattern("[a-z]+"));
Подробнее здесь: Регуляторы регулярного выражения Hamcrest.
Вам понадобятся эти две зависимости в пути к классам:
<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>
Ответ 5
Поскольку я также искал эту функциональность, я начал проект на GitHub под названием regex-tester. Это библиотека, которая облегчает тестирование регулярных выражений в Java (работает только с JUnit в настоящее время).
Библиотека очень ограничена прямо сейчас, но у нее есть совпадение Hamcrest, которое работает именно так.
assertThat("test", doesMatchRegex("tes.+"));
assertThat("test", doesNotMatchRegex("tex.+"));
Подробнее о том, как использовать regex-tester, здесь.
Ответ 6
Матчи, похожие на реализацию Ralph, были добавлены в официальную библиотеку совпадений Java Hamcrest. К сожалению, он еще не доступен в пакете релизов. Класс находится на GitHub, хотя если вы хотите посмотреть.
Ответ 7
это не JUnit, а вот еще один способ с fest-assert:
assertThat(myTestedValue).as("your value is so so bad").matches(expectedRegex);
Ответ 8
другой вариант, используя assertj. этот подход хорош, так как он позволяет передавать объект шаблона напрямую.
import static org.assertj.core.api.Assertions.assertThat;
assertThat("my\nmultiline\nstring").matches(Pattern.compile("(?s)my.*string", Pattern.MULTILINE));