Ruby的Test::Unit
有一个很好的assert_matches
方法,可以在单元测试中用来断言正则表达式与字符串匹配。
JUnit中有这样的东西吗?目前,我这样做:
assertEquals(true, actual.matches(expectedRegex));
答案 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)
答案 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 的更新,没有任何额外的库。
中的说明使用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):
.