在JUnit中断言正则表达式匹配

时间:2011-12-14 13:19:12

标签: java regex junit

Ruby的Test::Unit有一个很好的assert_matches方法,可以在单元测试中用来断言正则表达式与字符串匹配。

JUnit中有这样的东西吗?目前,我这样做:

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

10 个答案:

答案 0 :(得分:82)

如果使用assertThat()Hamcrest matcher测试正则表达式匹配,那么如果断言失败,您将收到一条指示预期模式和实际文本的好消息。断言也将更加流利地阅读,例如

assertThat("FooBarBaz", matchesPattern("^Foo"));

答案 1 :(得分:45)

我不知道其他选择。只需检查assert javadoc即可。 但是,只是一点点变化:

assertTrue(actual.matches(expectedRegex));
编辑:自从pholser的回答以来,我一直在使用Hamcrest匹配器,请检查一下!

答案 2 :(得分:18)

你可以使用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");

答案 3 :(得分:17)

您可以使用Hamcrest和jcabi-matchers

import static com.jcabi.matchers.RegexMatchers.matchesPattern;
import static org.junit.Assert.assertThat;
assertThat("test", matchesPattern("[a-z]+"));

此处有更多详情:Regular Expression 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 :(得分:4)

因为我也在寻找这个功能,所以我在GitHub上创建了一个名为regex-tester的项目。它是一个有助于在Java中轻松测试正则表达式的库(目前仅适用于JUnit)。

图书馆现在非常有限,但它确实有一个像这样工作的Hamcrest匹配器

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

有关如何使用正则表达式测试程序的更多信息是here

答案 5 :(得分:4)

类似于Ralph实现的匹配器已经added到官方Java Hamcrest匹配器库。不幸的是,它尚未在发布包中提供。如果您想看一下,该课程在GitHub上。

答案 6 :(得分:2)

另一种使用assertj的替代方案。这种方法很好,因为它允许您直接传递模式对象。

import static org.assertj.core.api.Assertions.assertThat;
assertThat("my\nmultiline\nstring").matches(Pattern.compile("(?s)my.*string", Pattern.MULTILINE));

答案 7 :(得分:2)

Hamcrest中有相应的匹配器:org.hamcrest.Matchers.matchesPattern(String regex)

As development of Hamcrest stalled您无法使用最新的v1.3:

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

相反,您需要使用新的开发系列(但仍然是dated by Jan 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]+$"));

答案 8 :(得分:1)


 它不是JUnit,但这是fest-assert的另一种方式:

assertThat(myTestedValue).as("your value is so so bad").matches(expectedRegex);

答案 9 :(得分:0)

JUnit 5 的更新,没有任何额外的库。

现在您可以按照 https://junit.org/junit5/docs/5.0.1/api/org/junit/jupiter/api/Assertions.html#assertLinesMatch-java.util.List-java.util.List-

中的说明使用 assertLinesMatch

创建断言是为了匹配多行文本,因此即使您尝试仅匹配一行,也需要提供 List。例如:

assertLinesMatch(List.of("Expected at the beginning.*"), List.of(contentUnderTest));

断言算法将尝试精确匹配,如果失败,将使用 String.match 将预期值解释为正则表达式。

重要说明:如果您的 contentUnderTest 包含多行,则正则表达式中的 .* 将不起作用({{1 }} 默认情况下不匹配换行符),因此您可能需要添加嵌入标志 (https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#DOTALL):

.