イントロダクション
JUnitでprivateメソッドのテストとか、特定のアノテーションやインターフェースのメソッドを直接呼び出したい時などにMethod.invokeが使えます。最近では言われなくなりましたが「< href="http://sp.e-words.jp/w/AOP.html">AOP」の実装で使われています。例として、特定のメソッドを呼び出す前と、後ろに何かの処理を挟み込む時に使うものです。
ウェブアプリなどではフレームワークとして実装済みのものが多いです。
前提
作成したクラスのprivateメソッドをテストしたい時、targetClass.getClass().getDeclaredMethod()」でテストしたいメソッドを取得、テスト起動!とやることができます。
早い話が
結論から言うと、インスタンスをinvoke()に渡してやれば、おっけ!
サンプルコード
JUnit使用しています。
Method method = null; try { method = target.getClass().getDeclaredMethod("createMap"); // 公開レベルをテストのために変更する method.setAccessible(true); } catch (NoSuchMethodException | SecurityException e) { e.printStackTrace(); } boolean isError = false; try { System.out.println(method.invoke(target)); } catch (IllegalAccessException e) { e.printStackTrace(); isError = true; } catch (IllegalArgumentException e) { e.printStackTrace(); isError = true; } catch (InvocationTargetException e) { e.printStackTrace(); isError = true; } catch (Exception e) { e.printStackTrace(); isError = true; }finally { if (isError) { fail("テスト失敗"); } }
JUNITを設定して、実行してみました。ハローワールドをやっています。
追伸、メソッドをこの様に呼び出すやり方は色々な所で使用出来ます。
一昔前は「AOP」なんて呼んでました。「横断的関心事」とかそんな言葉が残っています。
早い話が、特定のメソッドを呼び出すときの前と後ろに処理を挟み込む技術のことです。(笑)
http://sp.e-words.jp/w/AOP.html
## 関連ページ一覧
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Eclipse SceneBuilderを追加する
- JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
Java Basic一覧
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜