JUnit에서 정규식 일치 지정


84

Ruby 에는 정규식이 문자열과 일치하는지 확인하기 위해 단위 테스트에서 사용할 수 Test::Unit있는 멋진 assert_matches방법이 있습니다.

JUnit에 이와 같은 것이 있습니까? 현재 나는 이것을한다 :

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

답변:


99

정규식 일치를 테스트 assertThat()하는 Hamcrest 매처 와 함께 사용 하는 경우 어설 션이 실패하면 예상 패턴과 실제 텍스트를 나타내는 멋진 메시지를 받게됩니다. 주장은 또한 더 유창하게 읽을 것입니다.

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

Hamcrest 2를 사용하면에서 matchesPattern방법을 찾을 수 있습니다 MatchesPattern.matchesPattern.


21
2.0 Hamcrest이 가지고있는 Matchers.matchesPattern(String)현재 내장 : github.com/hamcrest/JavaHamcrest/blob/master/hamcrest-library/...
hinneLinks

5
무엇 @hinneLinks에 대한 퍼머은을 참조 : github.com/hamcrest/JavaHamcrest/blob/...
pioto

54

내가 아는 다른 선택은 없습니다. 확인하기 위해 javadoc 주장 을 확인했습니다. 하지만 약간의 변화가 있습니다.

assertTrue(actual.matches(expectedRegex));

편집 : 나는 pholser의 대답 이후로 Hamcrest 매처를 사용하고 있습니다.


1
아 예, assertTrue()확실히 더 좋습니다. 나는 그것에 대해 알지 못하는 Eclipse의 자동 완성을 비난합니다. )
조쉬 글로버

4
assertTrue만큼 세부로 당신을 줄 수 assertEquals또는 assertThat경우 테스트가 실패
마이크 Valenty

1
@Michael 물론입니다. assertTrue("Expected string matching '" +expectedRegex+ "'. Got: "+actual, actual.matches(expectedRegex));. 하지만 Hamcrest만큼 좋지는 않습니다.
MikeFHay 2013 년

@MikeValenty 그냥하는 값을 비교하는 경우 is(true), 다음 assertThat당신에게보다 더 상세하게 제공하지 않습니다 assertTrue수행합니다. 적절한 오류 메시지를 얻으려면 다른 매 처가 필요합니다 (또는 @MikeFHay가 제안한대로 메시지를 수동으로 구성합니다).
ThrawnCA

20

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");

18

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>

나는 hamcrest-core 종속성이 필요하지 않다는 것을 발견했습니다
JohnP2

4

이 기능도 찾고 있었기 때문에 GitHub에서 regex-tester 라는 프로젝트를 시작했습니다 . Java에서 정규 표현식을 쉽게 테스트하는 데 도움이되는 라이브러리입니다 (현재 JUnit에서만 작동 함).

라이브러리는 현재 매우 제한적이지만 이와 같이 작동하는 Hamcrest 매 처가 있습니다.

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

regex-tester를 사용하는 방법에 대한 자세한 내용은 여기에 있습니다 .


4

Ralph의 구현과 유사한 매 처가 공식 Java Hamcrest 매처 라이브러리 에 추가 되었습니다 . 안타깝게도 아직 릴리스 패키지에서 사용할 수 없습니다. 보기를 원한다면 수업이 GitHub있습니다 .


3

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]+$"));

오류가 발생합니다. jetified-hamcrest-core-1.3.jar (org.hamcrest : hamcrest-core : 1.3) 및 jetified-java-hamcrest-2.0.0.0.jar (org.hamcrest) 모듈에서 중복 클래스 org.hamcrest.BaseDescription을 찾았습니다. : 자바 hamcrest : 2.0.0.0)
a_subscriber

2

assertj를 사용하는 또 다른 대안. 이 접근 방식은 패턴 객체를 직접 전달할 수 있기 때문에 좋습니다.

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

1


JUnit은 아니지만 fest-assert를 사용하는 또 다른 방법이 있습니다.

assertThat(myTestedValue).as("your value is so so bad").matches(expectedRegex);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.