2015-01-05 18 views
6

TestNgからJUnitに切り替わります。私は、次のTestNGのコードのように事前に定義された正規表現と期待例外メッセージを一致させる必要があります正常に動作しますが、私はJUnitの中に同じ動作を実現することはできませんJUnit - 予想される例外メッセージ正規表現

@Test(expectedExceptions = SomeClass.class, expectedExceptionsMessageRegExp = "**[123]regexExample*") 
    public void should_throw_exception_when_...() throws IOException { 
     generatesException(); 
    } 

。私はこの解決策を考え出した:

@Rule 
public ExpectedException expectedEx = ExpectedException.none(); 

@Test 
public void should_throw_exception_when_...() throws IOException { 
    expectedEx.expect(SomeClass.class); 
    expectedEx.expectMessage("**[123]regexExample*"); 
    generatesException(); 
} 

しかし、正規表現をサポートしていませんexpectedEx.expectMessage("**[123]regexExample*");方法は、私は正確なハードコードメッセージとそれを提供する必要があります。私はMatcherを使ってそのメソッドを提供することでこれが実現できるのを見ましたが、正しく行う方法がわかりません。

これを行う良い方法はありますか?

+0

別の回避策がありますが、テストでは、予想される例外をキャッチし、メッセージを正規表現で、正しいことを主張することができます。例外がスローされなかった場合、 'assert.fail()' – Magnilex

答えて

7

何...

@Rule 
public ExpectedException expectedEx = ExpectedException.none(); 

@Test 
public void test1() throws IOException { 
    expectedEx.expect(SomeClass.class); 
    expectedEx.expectMessage(matchesRegex("**[123]regexExample*")); 
    generatesException(); 
} 

private Matcher<String> matchesRegex(final String regex) { 
    return new TypeSafeMatcher<String>() { 
    @Override 
    protected boolean matchesSafely(final String item) { 
     return item.matches(regex); 
    } 
    }; 
} 
4

StringContainsマッチャーを使用できますか?

expectedEx.expectMessage(StringContains.containsString("regexExample")); 

残念ながら、(私が知っている)ライブラリには正規表現マッチャーはありません。多くの人々が独自の方法を実装しています。以下のような何かについて

+0

私が探していた正確なものではありませんが、それは私を少し助けました。 +1。 – Filip

関連する問題