Подтвердите совпадения с регулярным выражением в JUnit - PullRequest
67 голосов
/ 14 декабря 2011

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

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

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

Ответы [ 9 ]

82 голосов
/ 14 декабря 2011

Если вы используете assertThat() с Hamcrest matcher , который проверяет совпадения регулярных выражений, то, если утверждение не выполнено, вы получите хорошее сообщение, которое указывает на ожидаемый образец и фактический текст. Утверждение также будет читаться более свободно, например,

assertThat("FooBarBaz", matchesPattern("^Foo"));
46 голосов
/ 14 декабря 2011

Нет другого выбора, который я знаю. Просто проверил assert javadoc , чтобы быть уверенным. Небольшое изменение:

assertTrue(actual.matches(expectedRegex));

РЕДАКТИРОВАТЬ: Я использую совпадения Hamcrest с момента ответа pholser, проверьте это тоже!

18 голосов
/ 29 июля 2014

Вы можете использовать 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");
17 голосов
/ 31 января 2015

Вы можете использовать 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>
4 голосов
/ 03 октября 2014

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

4 голосов
/ 15 марта 2014

Поскольку я также искал эту функциональность, я запустил проект на GitHub под названием regex-tester . Это библиотека, которая помогает упростить тестирование регулярных выражений в Java (в настоящее время работает только с JUnit).

Библиотека сейчас очень ограничена, но у нее есть совпадение Hamcrest, которое работает следующим образом

assertThat("test", doesMatchRegex("tes.+"));
assertThat("test", doesNotMatchRegex("tex.+"));

Подробнее об использовании regex-tester можно узнать здесь: .

2 голосов
/ 03 мая 2018

В Hamcrest есть соответствующий сопоставитель: org.hamcrest.Matchers.matchesPattern (String regex) .

Поскольку разработка Hamcrest остановилась , вы не можете использоватьпоследняя доступная версия 1.3:

testCompile("org.hamcrest:hamcrest-library:1.3")

Вместо этого вам нужно использовать новую серию разработчиков (но все же от января 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]+$"));
2 голосов
/ 13 декабря 2017

другая альтернатива, использующая assertj. этот подход хорош тем, что позволяет напрямую передавать объект шаблона.

import static org.assertj.core.api.Assertions.assertThat;
assertThat("my\nmultiline\nstring").matches(Pattern.compile("(?s)my.*string", Pattern.MULTILINE));
1 голос
/ 30 января 2013


это не JUnit, но вот другой способ с fest-assert:

assertThat(myTestedValue).as("your value is so so bad").matches(expectedRegex);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...