またサンプル。
/** * */ package sample5; /** * @author ssiscirine * */ public class Sample5 { /** * @param args */ public static String publicStaticMethod1(String param1) { //privateStaticMethod1(param1); return param1; } /** * @param args * @throws Exception */ @SuppressWarnings("unused") private static String privateStaticMethod1(String param1) throws Exception { //Sample5 s5 = new Sample5(); //s5.privateMethod1(param1); if (param1 == null) { throw new Exception("パラメータがnull"); } return param1; } /** * @param args */ public String publicMethod1(String param1) { return param1; } /** * @param args * @throws Exception */ @SuppressWarnings("unused") private String privateMethod1(String param1) throws Exception { if (param1 == null) { throw new Exception("パラメータがnull"); } return param1; } }
@SuppressWarnings(“unused”)は、privateなメソッドなのに使ってないせい。
/** * */ package sample5; import static org.junit.Assert.*; import static org.junit.Assume.*; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestName; import org.junit.runners.MethodSorters; /** * @author slani * */ //テストケースの名前順に実行する指定 @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class Sample5Test { @Rule //テストケースのメソッド名を知りたくて追加。 public TestName name = new TestName(); /** * @throws java.lang.Exception */ @BeforeClass public static void setUpBeforeClass() throws Exception { // System.out.println("setUpBeforeClass() JUnitを開始します。"); } /** * @throws java.lang.Exception */ @AfterClass public static void tearDownAfterClass() throws Exception { // System.out.println("tearDownAfterClass() JUnitを終了します"); } /** * @throws java.lang.Exception */ @Before public void setUp() throws Exception { // System.out.println(name.getMethodName() + "のための setUp() テストケースの事前処理を行います。"); } /** * @throws java.lang.Exception */ @After public void tearDown() throws Exception { // System.out.println(name.getMethodName() + "のための" + " tearDown() テストケースの事後処理を行います。"); } //Sample5#publicStaticMethod1用 /** * {@link sample5.Sample5#publicStaticMethod1(java.lang.String)} のためのテスト・メソッド。 */ @Test public final void testPublicStaticMethod1_success() { Sample5.publicStaticMethod1("parame1"); } //Sample5#privateStaticMethod1用 /** * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException */ @Test public final void testPrivateStaticMethod1_Success() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Sample5 s5 = new Sample5(); Method m = null; m = Sample5.class.getDeclaredMethod("privateStaticMethod1", String.class); m.setAccessible(true); //正常ケース String rc = (String) m.invoke(s5, "param1"); assertEquals("param1", rc); } /** * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException */ @Test public final void testPrivateStaticMethod1_NoSuchMethodException_01() throws SecurityException { Sample5 s5 = new Sample5(); try { Sample5.class.getDeclaredMethod("privateStaticMethodX", String.class); } catch (NoSuchMethodException e1) { assumeNoException(e1.getLocalizedMessage(), e1); } } /** * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException */ @Test public final void testPrivateStaticMethod1_NoSuchMethodException_02() throws SecurityException { Sample5 s5 = new Sample5(); try { Sample5.class.getDeclaredMethod("privateStaticMethod1", int.class); } catch (NoSuchMethodException e1) { assumeNoException(e1.getLocalizedMessage(), e1); } } /** * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException */ @Test public final void testPrivateStaticMethod1_IllegalAccessException() throws NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { Sample5 s5 = new Sample5(); Method m = null; m = Sample5.class.getDeclaredMethod("privateStaticMethod1", String.class); //異常ケース String rc = null; try { rc = (String) m.invoke(s5, "param1"); } catch (IllegalAccessException e) { assumeNoException(e.getLocalizedMessage(), e); } } /** * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException */ @Test public final void testPrivateStaticMethod1_IllegalArgumentException() throws NoSuchMethodException, SecurityException, IllegalAccessException, InvocationTargetException { Sample5 s5 = new Sample5(); Method m = null; m = Sample5.class.getDeclaredMethod("privateStaticMethod1", String.class); m.setAccessible(true); //異常ケース String rc = null; try { rc = (String) m.invoke(s5, 1, 2, 3); } catch (IllegalArgumentException e) { assumeNoException(e.getLocalizedMessage(), e); } } /** * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException */ @Test public final void testPrivateStaticMethod1_InvocationTargetException() throws NoSuchMethodException, SecurityException, IllegalAccessException { Sample5 s5 = new Sample5(); Method m = null; m = Sample5.class.getDeclaredMethod("privateStaticMethod1", String.class); m.setAccessible(true); //異常ケース String rc = null; try { rc = (String) m.invoke(s5, (String) null); } catch (InvocationTargetException e) { assumeNoException("target : " + e.getTargetException() + ", msg : " + e.getLocalizedMessage(), e); } } //Sample5#publicMethod1用 /** * {@link sample5.Sample5#publicMethod1(java.lang.String)} のためのテスト・メソッド。 */ @SuppressWarnings("static-access") @Test public final void testPublicMethod1_success() { Sample5 s5 = new Sample5(); s5.publicMethod1("parame1"); } //Sample5#privateMethod1用 /** * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException */ @Test public final void testPrivateMethod1_Success() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Sample5 s5 = new Sample5(); Method m = null; m = Sample5.class.getDeclaredMethod("privateMethod1", String.class); m.setAccessible(true); //正常ケース String rc = (String) m.invoke(s5, "param1"); assertEquals("param1", rc); } /** * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException */ @Test public final void testPrivateMethod1_NoSuchMethodException_01() throws SecurityException { Sample5 s5 = new Sample5(); try { Sample5.class.getDeclaredMethod("privateMethodX", String.class); } catch (NoSuchMethodException e1) { assumeNoException(e1.getLocalizedMessage(), e1); } } /** * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException */ @Test public final void testPrivateMethod1_NoSuchMethodException_02() throws SecurityException { Sample5 s5 = new Sample5(); try { Sample5.class.getDeclaredMethod("privateMethod1", int.class); } catch (NoSuchMethodException e1) { assumeNoException(e1.getLocalizedMessage(), e1); } } /** * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException */ @Test public final void testPrivateMethod1_IllegalAccessException() throws NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { Sample5 s5 = new Sample5(); Method m = null; m = Sample5.class.getDeclaredMethod("privateMethod1", String.class); //異常ケース String rc = null; try { rc = (String) m.invoke(s5, "param1"); } catch (IllegalAccessException e) { assumeNoException(e.getLocalizedMessage(), e); } } /** * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException */ @Test public final void testPrivateMethod1_IllegalArgumentException() throws NoSuchMethodException, SecurityException, IllegalAccessException, InvocationTargetException { Sample5 s5 = new Sample5(); Method m = null; m = Sample5.class.getDeclaredMethod("privateMethod1", String.class); m.setAccessible(true); //異常ケース String rc = null; try { rc = (String) m.invoke(s5, 1, 2, 3); } catch (IllegalArgumentException e) { assumeNoException(e.getLocalizedMessage(), e); } } /** * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。 * @throws SecurityException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException */ @Test public final void testPrivateMethod1_InvocationTargetException() throws NoSuchMethodException, SecurityException, IllegalAccessException { Sample5 s5 = new Sample5(); Method m = null; m = Sample5.class.getDeclaredMethod("privateMethod1", String.class); m.setAccessible(true); //異常ケース String rc = null; try { rc = (String) m.invoke(s5, (String) null); } catch (InvocationTargetException e) { assumeNoException("target : " + e.getTargetException() + ", msg : " + e.getLocalizedMessage(), e); } } }
比較のためpublicなメソッドの呼び出しも混ぜてある。
publicなメソッドなら普通に呼び出せるが、privateなメソッドはクラスの外からは普段見えないものだから・・・
Method m = {使いたいメソッドのクラス名}.class.getDeclaredMethod(“使いたいメソッドの名前”, 引数1.class, 引数2.class, … );
な感じでprivateなメソッドの情報を取得し、
m.setAccessible(true);
で、privateなメソッドに一時的にクラスの外から使用できるようにしてから・・・
rc = (戻り値のキャスト) m.invoke(s5, (パラメータ1のキャスト) パラメータ1, (パラメータ2のキャスト) パラメータ2, …);
な感じでメソッドを呼び出す。
しかし、戻り値もパラメータもキャストを使うので、ミスった時はどうなるのか?
調べてみたら・・・ソースが長くなってしまった。
そのcatchの処理も、想定通りのExceptionが通ればいいが最初は大抵想定外な結果になるのでfailではなくassumeNoexceptionを使い、想定内ならIgnore、想定外ならFailになるようにした。
ちょっと判りにくいけど、InvocationTargetExceptionは呼び出し先でExceptionがThrowされた場合に処理されるので、Sample5.javaでパラメータがnullだったらExceptionをThrowしている。
setUpBeforeClass() JUnitを開始します。 testPrivateMethod1_IllegalAccessExceptionのための setUp() テストケースの事前処理を行います。 testPrivateMethod1_IllegalAccessExceptionのための tearDown() テストケースの事後処理を行います。 testPrivateMethod1_IllegalArgumentExceptionのための setUp() テストケースの事前処理を行います。 testPrivateMethod1_IllegalArgumentExceptionのための tearDown() テストケースの事後処理を行います。 testPrivateMethod1_InvocationTargetExceptionのための setUp() テストケースの事前処理を行います。 testPrivateMethod1_InvocationTargetExceptionのための tearDown() テストケースの事後処理を行います。 testPrivateMethod1_NoSuchMethodException_01のための setUp() テストケースの事前処理を行います。 testPrivateMethod1_NoSuchMethodException_01のための tearDown() テストケースの事後処理を行います。 testPrivateMethod1_NoSuchMethodException_02のための setUp() テストケースの事前処理を行います。 testPrivateMethod1_NoSuchMethodException_02のための tearDown() テストケースの事後処理を行います。 testPrivateMethod1_Successのための setUp() テストケースの事前処理を行います。 testPrivateMethod1_Successのための tearDown() テストケースの事後処理を行います。 testPrivateStaticMethod1_IllegalAccessExceptionのための setUp() テストケースの事前処理を行います。 testPrivateStaticMethod1_IllegalAccessExceptionのための tearDown() テストケースの事後処理を行います。 testPrivateStaticMethod1_IllegalArgumentExceptionのための setUp() テストケースの事前処理を行います。 testPrivateStaticMethod1_IllegalArgumentExceptionのための tearDown() テストケースの事後処理を行います。 testPrivateStaticMethod1_InvocationTargetExceptionのための setUp() テストケースの事前処理を行います。 testPrivateStaticMethod1_InvocationTargetExceptionのための tearDown() テストケースの事後処理を行います。 testPrivateStaticMethod1_NoSuchMethodException_01のための setUp() テストケースの事前処理を行います。 testPrivateStaticMethod1_NoSuchMethodException_01のための tearDown() テストケースの事後処理を行います。 testPrivateStaticMethod1_NoSuchMethodException_02のための setUp() テストケースの事前処理を行います。 testPrivateStaticMethod1_NoSuchMethodException_02のための tearDown() テストケースの事後処理を行います。 testPrivateStaticMethod1_Successのための setUp() テストケースの事前処理を行います。 testPrivateStaticMethod1_Successのための tearDown() テストケースの事後処理を行います。 testPublicMethod1_successのための setUp() テストケースの事前処理を行います。 testPublicMethod1_successのための tearDown() テストケースの事後処理を行います。 testPublicStaticMethod1_successのための setUp() テストケースの事前処理を行います。 testPublicStaticMethod1_successのための tearDown() テストケースの事後処理を行います。 tearDownAfterClass() JUnitを終了します
Junitのビューを見るとxxxxx_success は〇、他はIgnoreになっている。
次は mockかな・・・