JUnitで正規表現の一致をアサートします


84

RubyにTest::Unitは、assert_matches正規表現が文字列と一致することを表明するための単体テストで使用できる優れたメソッドがあります。

JUnitにこのようなものはありますか?現在、私はこれを行います:

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

回答:


100

正規表現の一致をテスト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

私が知っている他の選択肢はありません。確認のためにassertjavadocをチェックしました。ただし、ほんの少しの変更です。

assertTrue(actual.matches(expectedRegex));

編集:私はpholserの答え以来Hamcrestマッチャーを使用しています、それもチェックしてください!


1
ああ、はい、assertTrue()間違いなくいいです。私はそれについて知らない私のためにEclipseのオートコンプリートを非難します。;)
Josh Glover 2011

4
assertTrue多くの詳細としてあなたを与えることができないassertEqualsか、assertThatテストが失敗したときに
マイクValenty

1
@Michaelもちろんできます。assertTrue("Expected string matching '" +expectedRegex+ "'. Got: "+actual, actual.matches(expectedRegex));。しかし、それはハムクレストほど良くはありません。
MikeFHay 2013

@MikeValenty値をと比較しているだけの場合はis(true)、それassertThat以上の詳細は表示されassertTrueません。適切なエラーメッセージを取得するには、別のマッチャーが必要です(または、@ MikeFHayが提案したようにメッセージを手動で作成します)。
ThrawnCA 2017年

20

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

18

Hamcrestとjcabi-matchersを使用できます:

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

詳細はこちら:正規表現ハムクレストマッチャー

クラスパスには次の2つの依存関係が必要です。

<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 2017年

4

この機能も探していたので、GitHubでregex-testerというプロジェクトを開始しました。これは、Javaでの正規表現のテストを容易にするのに役立つライブラリです(現在、JUnitでのみ機能します)。

ライブラリは現在非常に限られていますが、このように機能するハムクレストマッチャーがあります

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

regex-testerの使用方法の詳細については、こちらをご覧ください


4

Ralphの実装と同様のマッチャーが、公式のJavaHamcrestマッチャーライブラリに追加ました。残念ながら、リリースパッケージではまだ利用できません。クラスは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が見つかりました:Javaの-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.