2016-03-27 8 views
0

ユニットテストにTestNGを使用しています。例外メッセージを確認したいと思います。 OK、@Test(expectedExceptionsMessageRegExp = ...)は私が必要とするものです。まあ、同時に私はメッセージを外部化して、自分のコードと混ざらないようにしたいと思っています。私の例外コードが正確に混ざらないこれら二つのものを除いて完全に私のためにTestNG expectedExceptionsMessageRegExpと外部化されたメッセージ

throw new IllegalArgumentException(MessageFormat.format(
    EXCEPTIONS.getString(EX_NOT_A_VALID_LETTER), c)); 

作品、のように見えるので、私は緩く、a guide by Brian Goetzを次のようです。私はregexize.*{0} - 形式のプレースホルダを置き換えることになっている機能であり、ここで

@Test(dataProvider = "getInvalidLetters", 
    expectedExceptions = {IllegalArgumentException.class}, 
    expectedExceptionsMessageRegExp = regexize(EXCEPTIONS.getString(EX_NOT_A_VALID_LETTER))) 

を書き込むことはできません。しかし、これは "要素値は定数式でなければなりません"と失敗します。コンパイル時に必要なので意味があります。しかし、可能な回避策はありますか?

これらの構文を実際のメッセージ正規表現に置き換えるテストコードジェネレーターは想像できますが、IDE、SCM、ビルドツールなどと統合するのは苦労でしょう。

もう1つの方法はtry-catchを使用し、例外メッセージを手動で確認することです。しかし、これは醜いです。

最後には、私は本当に、素晴らしいものになるでしょう

@Test(expectedExceptionsMessageBundle = "bundle.name.goes.here", 
     expectedExceptionsMessageLocaleProvider = "functionReturningListOfLocales" 
     expectedExceptionsMessageKey = "MESSAGE_KEY_GOES_HERE") 

このようなものでTestNGのをハックすることは可能であるべきだと思います。それ以外は、Mavenが私のレポから取り出したのと同じTestNGではありません。もう一つの選択肢は、これを実装し、TestNGにパッチを提供し、それがリリースされるのを待つことです。私は真剣にこのオプションを検討していますが、もっと簡単な方法がありますか?明白な何かを逃したことはありませんか?私はおそらくこの問題の唯一の人にはなれません!

また、メッセージを間違った方法で外部化している可能性があります。しかし、ブライアン・ゲッツのような人は間違っていることはできません。または私は彼を間違って取得しましたか?ここで与えられた回答に基づいて

更新

、私は、NetBeans 8.1を使用する場合は特に、いくつかの落とし穴をカバーし、a tutorial on the topicを作りました。

答えて

2

ここでannotation transformerを使用しないのはなぜですか?

あなたが何か行うことができるようになります:注釈変圧器は次のようになります

@LocalizedException(expectedExceptionsMessageBundle = "bundle.name.goes.here", 
     expectedExceptionsMessageLocaleProvider = "functionReturningListOfLocales" 
     expectedExceptionsMessageKey = "MESSAGE_KEY_GOES_HERE") 
@Test(dataProvider = "getInvalidLetters", 
     expectedExceptions = {IllegalArgumentException.class) 
public void test() { 
    // ... 
} 

public class LocalizedExceptionTransformer implements IAnnotationTransformer { 
    public void transform(ITest annotation, Class testClass, 
     Constructor testConstructor, Method testMethod) { 
    if (testMethod != null) { 
     LocalizedException le = testMethod.getAnnotation(LocalizedException.class); 
     if (le != null) { 
     String regexp = regexize(le); 
     annotation.setExpectedExceptionsMessageRegExp(regexp); 
     } 
    } 
    } 
} 
+0

は私がように見えることはできませんことを除いて、私は、必要な正確に何を非常にルックスをあなたの例のように注釈変圧器を実際の注釈に変換する方法に関するチュートリアルを見つけてください。ドキュメントでは、トランスフォーマーをリスナーとして登録することもできますが、これも許容されますが、コマンドラインやリスナーを使用するよりもはるかに優れています。 –

+0

ああ、持っています。変圧器を実際に検出して既存の注釈を使用することを意味します。しかし、クラスを注釈にすることは可能ですか?注釈はインターフェースであると思った。 –

+0

'@ LocalizedException'はカスタム注釈であり、' ITest'は初期化時に '@ Test'からコピーされた情報を含むTestNGオブジェクトです。あなたの質問に答えますか? – juherr

関連する問題