Ruby 에는 정규식이 문자열과 일치하는지 확인하기 위해 단위 테스트에서 사용할 수 Test::Unit
있는 멋진 assert_matches
방법이 있습니다.
JUnit에 이와 같은 것이 있습니까? 현재 나는 이것을한다 :
assertEquals(true, actual.matches(expectedRegex));
답변:
정규식 일치를 테스트 assertThat()
하는 Hamcrest 매처 와 함께 사용 하는 경우 어설 션이 실패하면 예상 패턴과 실제 텍스트를 나타내는 멋진 메시지를 받게됩니다. 주장은 또한 더 유창하게 읽을 것입니다.
assertThat("FooBarBaz", matchesPattern("^Foo"));
Hamcrest 2를 사용하면에서 matchesPattern
방법을 찾을 수 있습니다 MatchesPattern.matchesPattern
.
내가 아는 다른 선택은 없습니다. 확인하기 위해 javadoc 주장 을 확인했습니다. 하지만 약간의 변화가 있습니다.
assertTrue(actual.matches(expectedRegex));
편집 : 나는 pholser의 대답 이후로 Hamcrest 매처를 사용하고 있습니다.
assertTrue()
확실히 더 좋습니다. 나는 그것에 대해 알지 못하는 Eclipse의 자동 완성을 비난합니다. )
assertTrue
만큼 세부로 당신을 줄 수 assertEquals
또는 assertThat
경우 테스트가 실패
assertTrue("Expected string matching '" +expectedRegex+ "'. Got: "+actual, actual.matches(expectedRegex));
. 하지만 Hamcrest만큼 좋지는 않습니다.
is(true)
, 다음 assertThat
당신에게보다 더 상세하게 제공하지 않습니다 assertTrue
수행합니다. 적절한 오류 메시지를 얻으려면 다른 매 처가 필요합니다 (또는 @MikeFHay가 제안한대로 메시지를 수동으로 구성합니다).
Hamcrest를 사용할 수 있지만 자신 만의 matcher를 작성해야합니다.
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("[a-z]+"));
자세한 내용은 정규식 Hamcrest Matchers를 참조하세요 .
클래스 경로에 다음 두 가지 종속성이 필요합니다.
<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>
이 기능도 찾고 있었기 때문에 GitHub에서 regex-tester 라는 프로젝트를 시작했습니다 . Java에서 정규 표현식을 쉽게 테스트하는 데 도움이되는 라이브러리입니다 (현재 JUnit에서만 작동 함).
라이브러리는 현재 매우 제한적이지만 이와 같이 작동하는 Hamcrest 매 처가 있습니다.
assertThat("test", doesMatchRegex("tes.+"));
assertThat("test", doesNotMatchRegex("tex.+"));
regex-tester를 사용하는 방법에 대한 자세한 내용은 여기에 있습니다 .
Hamcrest에는 해당 매 처가 있습니다 : org.hamcrest.Matchers.matchesPattern (String regex) .
Hamcrest의 개발이 지연되면서 최신 v1.3을 사용할 수 없습니다.
testCompile("org.hamcrest:hamcrest-library:1.3")
대신 새로운 개발 시리즈를 사용해야합니다 (그러나 2015 년 1 월까지 계속됨 ).
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]+$"));
Matchers.matchesPattern(String)
현재 내장 : github.com/hamcrest/JavaHamcrest/blob/master/hamcrest-library/...