Подтвердить что ты не робот

Соответствовать регулярному выражению в JUnit

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

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

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

Ответ 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));