Effective Javaを読むチャレンジ-項目35 その2-

アノテーションの使用

前回は省略しましたが、本書では、Testアノテーションには「パラメータなしのstaticメソッドに対してだけ使用すること」という制約を設けています。その制約はコンパイラでチェックすることができないので、テストランナーで対応することになります。

また、サンプルのTestアノテーションのように、パラメータを持たないアノテーションをマーカーアノテーションと呼びます。「パラメータを持たない」というのは、アノテーション本体が空で、何かしらのメンバを持っていないということです。前回記述したTestアノテーションを載せておきます。

ということで、テストランナーを作っていきます。まずは、テスト対象となるプログラムです。

上記のクラスに対して、Testアノテーションが適切に使用されているかどうかテストします。コメントに書いたとおり、「パラメータなしのstaticメソッド」ならテスト成功、例外がスローされればテスト失敗、「パラメータなしのstaticメソッド」でない場合は不正なアノテーション使用という結果がきちんと得られるようなテストランナーを作ります。また、本書にはないですが、パラメータつきのstaticメソッドを最後に2つ追加してみました。次にテストランナーです。

isAnnotationPresentメソッドはアノテーション対象のプログラム構成要素に対して、引数のアノテーション型が使用されているかどうかを調べるメソッドです。本書では「ツールがどのメソッドを実行すべきか」と書かれていますが、要は引数のTestアノテーションが使用されているかどうかを調べています。

invokeメソッドは、第1引数に実行対象となるメソッドを有するクラスのインスタンスを渡します。その引数がnullの場合はstaticメソッドの実行となります。そのときにインスタンスメソッドが指定されると、invokeメソッドはNullPointerExceptionをスローします。

今回はinvokeメソッドの第2引数である実行するメソッドの実引数を指定していないため、パラメータつきのメソッドを実行した場合、宣言されたメソッドの仮引数と実際に実行する実引数が異なってしまい、IllegalArgumentExceptionをスローします。

ここまでで、「Testアノテーションを使用したパラメータなしのstaticメソッド」のみがinvokeメソッドによって正常に実行されることが分かると思います。

そしてinvokeメソッドを利用して正常に実行されたテスト対象のメソッドが何らかの例外をスローした場合、invokeメソッドはInvocationTargetExceptionをスローします。これにより、テスト対象のメソッドが例外をスローした場合にテスト失敗とすることができます。

これで適切にTestアノテーションが使用されているか調べるテストランナーができました。上記のテスト結果は以下となります。

最終的な目的は、命名パターンの短所の3つ目「適切なプログラム要素にパラメータを関連付ける良い方法を提供していない」ことへの解決策の例として、特定の例外をスローした場合にだけ成功する種類のテストをサポートすることでした。今回はまだそこまでには至っていません。アノテーションの使い方を知ることができたので、いよいよ特定の例外をスローした場合にだけ成功するアノテーションを作成することになります。というわけで、以下次回。

広告
  • LINEで送る