Утверждение регулярных выражений матчей в JUnit


Рубин Test::Unit приятный assert_matches метод, который может использоваться в модульных тестов, чтобы утверждать, что регулярное выражение соответствует строке.

есть ли что-нибудь подобное в JUnit? В настоящее время я делаю это:

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

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 здесь.

сопоставитель, похожий на реализацию Ральфа, был добавил в официальную библиотеку Java Hamcrest matchers. К сожалению, он еще не доступен в пакете выпуска. Класс о GitHub хотя если вы хотите посмотреть.


это не 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]+$"));