JUnit-Addons

てのがあったんですね、知らなかった。

Privateメソッドのテスト自体ふんふんとid:t-doiさんに言われてしまいましたが、
そういうのは、リフレクションでやるものだと思ってました。

こういうのもあるんですな。

せっかくなので、書いたコードを・・・ってJavaWorldの引用ですが。


テストしたいクラス

package com.seigi.priv;
public class WithPrivate {
  private static int field1;
  public static void main(String[] args) {
    field1 =10;
    WithPrivate withPrivate = new WithPrivate();
    int ans = withPrivate.prv(10);
    System.out.println("ans==>"+ans );
  }

  private int prv(int a){
    if (field1 == 0) {
      throw new IllegalStateException();
    }
    return this.field1*a;
  }
}


テストクラス

package com.seigi.priv;

import junit.framework.TestCase;
import junitx.util.PrivateAccessor;
import junitx.util.ThrowableUtil;

public class WithPrivateTest extends TestCase {
  public void testPrv_成功()throws Throwable {
    WithPrivate private1 = new WithPrivate();
    //フィールドに値をセット
    PrivateAccessor.setField(private1, "field1", new Integer(10));
    //privateメソッドを呼び出し
    Integer actual = (Integer)PrivateAccessor.invoke(private1,"prv",
        new Class{int.class},new Object{new Integer(5)});
        //検証
        assertEquals("積になる", 10*5, actual.intValue());
  }

  public void testPrv_例外()throws Throwable {
    WithPrivate private1 = new WithPrivate();
    //フィールドに値をセット
    PrivateAccessor.setField(private1, "field1", new Integer(0));
    try {
        //privateメソッドを呼び出し
        PrivateAccessor.invoke(private1,"prv",
            new Class{int.class},new Object{new Integer(5)});
        fail("例外発生");
    } catch (IllegalStateException e) {
        System.out.println("Catch!!!");
    }
  }
}