在JUnit中声明正则expression式匹配

Ruby的Test::Unit有一个很好的assert_matches方法,可以在unit testing中用来声明一个正则expression式匹配一个string。

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

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

如果你使用assertThat()和Hamcrest匹配器来testing正则expression式匹配,那么如果断言失败,你会得到一个很好的消息,指示预期的模式和实际文本。 断言也会更stream利地阅读,例如

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

没有其他select,我知道。 刚刚检查了断言javadoc是肯定的。 虽然只是一个小小的变化:

 assertTrue(actual.matches(expectedRegex)); 

编辑:我一直在使用Hamcrest匹配器,因为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("[az]+")); 

更多细节在这里: 正则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> 

因为我也在寻找这个function,所以我在GitHub上启动了一个名为regex-tester的项目 。 这是一个图书馆,有助于缓解在Javatesting正则expression式(目前只适用于JUnit)。

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

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

更多关于如何使用正则expression式testing器在这里 。

一个类似于Ralph实现的匹配器已经被添加到官方的Java Hamcrest匹配器库中。 不幸的是,它还没有在发行包中提供。 虽然如果你想看看,那么这个类就在GitHub上 。

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

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