2012-02-20 8 views
18

2つの注釈を互いに排他的にマークすることはできますか?相互に排他的な注釈

カスタムJUnitランナーがあります。テストに私の注釈@Customとマークされている場合は、@Testでマークすると、コンパイルエラーまたは(あまり好ましくはないが)実行時エラーがスローされます。

@Customは、基本的に@Testですが、テストを実行する前にいくつかの余分な前処理が必要です。そして、私がそれをコード化したやり方では、各カスタムタグについて(はい、複数あります)、毎回対応する前処理で何度もテストが実行されます。したがって、それが@Testのために実行されても、そのテストはいくつかの前処理を有することが意図されているので意味をなさない。

また、同じテスト方法ではなく、@Custom@Testの両方を自分のフレームワークでサポートしたいと思います。

+5

これは、実行時エラーとして簡単に実装できます。 '@ Custom'を処理するコードの間に' @ Test'がさらに存在するかどうかを確認するだけです。私はこれがコンパイル時に可能であると信じていませんが、注釈プロセッサを使用する必要はありません。価値のない可能性が高い痛みの全領域。 – FauxFaux

+2

ここではPMDなどの静的解析ツールを利用できます。 –

+0

これを試すhttp://stackoverflow.com/questions/378616/can-i-generate-a-compile-time-error-based-on-the-type-of-the-field-being-annotat – Shahzeb

答えて

1

実際には、Java要素に設定できるアノテーションに制限を設ける方法はありません。たとえば、フィールドを@Required@Optionalの両方としてマークすることはできますが、これはまったく無意味です。

注釈が存在するかどうかを調べたり、興味のある特定のものを探して例外をスローする(ユニットテストで検出される)場合は、実行時にチェックする必要があります。

特定の問題を解決する方法があります。特定のテストケースを特別に扱いたい場合は、独自のテストランナーを実装し、@RunWith注釈を使用して呼び出すことができます。次に、あなたのメソッドが前提条件のアクションを取得できるようにすることができます。

1

Java Annotation Processingを使用して(コンパイル作業に失敗したポストコンパイル操作を呼び出すことによって)これを行うことができますが、それは不必要に複雑です。 (本当にしたいのなら、私に教えてください。そして私はあなたのためにそのコードを掘り出します)。より簡単に、あなたが手動で呼び出して情報を収集する小さなクラスを持つことができます。

ので、より正確な:あなたはあなたのための(自分を唯一のあなた)それを必要としない利便性として、あるいは、あなたが自動化されたソリューションとして、あなたの巨大なプロジェクトのためにそれが必要なのですか

0
(およびそれにいくつかの努力を入れても構わないと思っています?)

あなたのフレームワークでコードが実行されているので、@Customで注釈が付けられたすべてのクラスにpointCutを追加してAOPコードを追加して相互排他関係を確認し、@Testに注釈が付いている場合はRuntimeExceptionをスローすることができます。

関連する問題