イントロダクション
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