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

Jos*_*ver 69 java regex junit

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

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

assertEquals(true, actual.matches(expectedRegex));
Run Code Online (Sandbox Code Playgroud)

pho*_*ser 85

如果你使用assertThat()Hamcrest匹配,对正则表达式匹配测试,那么如果断言失败,你会得到一个不错的消息,表明预期的模式和实际文本.断言也将更加流利地阅读,例如

assertThat("FooBarBaz", matchesPattern("^Foo"));
Run Code Online (Sandbox Code Playgroud)

  • 要清楚,在hamcrest AFAICT中实际上不存在这样的`matchesPattern`匹配方法,你必须编写自己的匹配器. (48认同)
  • Hamcrest 2.0现在内置了`Matchers.matchesPattern(String)`:https://github.com/hamcrest/JavaHamcrest/blob/master/hamcrest-library/src/main/java/org/hamcrest/Matchers.java #L1401 (14认同)
  • `matchesPattern`存在于[jcabi-matchers]中(http://matchers.jcabi.com/regex-matchers.html) (6认同)
  • @hinneLinks所指的固定链接:https://github.com/hamcrest/JavaHamcrest/blob/8f9372a152612b45f51a12d1c549643fdac5492a/hamcrest-library/src/main/java/org/hamcrest/Matchers.java#L1474-L1480 (4认同)

Miq*_*uel 48

我不知道其他选择.刚刚检查了断言javadoc以确定.但是,只是一点点变化:

assertTrue(actual.matches(expectedRegex));
Run Code Online (Sandbox Code Playgroud)

编辑:自从pholser的回答以来,我一直在使用Hamcrest匹配器,请检查一下!

  • 测试失败时,`assertTrue`不能提供与`assertEquals`或`assertThat`一样多的细节 (4认同)
  • @迈克尔当然可以。`assertTrue("预期字符串匹配 '" +expectedRegex+ "'。得到:"+actual,actual.matches(expectedRegex));`。不过它不像汉克雷斯特那么好。 (2认同)

Ral*_*lph 19

你可以使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

import org.junit.Assert;


Assert.assertThat("test", RegexMatcher.matchesRegex(".*est");
Run Code Online (Sandbox Code Playgroud)


yeg*_*256 17

你可以使用Hamcrest和jcabi-matchers:

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

更多细节:正则表达式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>
Run Code Online (Sandbox Code Playgroud)