やぼったい開発 > JUnit-addonsライブラリとprivateアクセッサメソッド

JUnit-addonsライブラリとprivateアクセッサメソッド


UT試験の自動化のためのスキル.

JUnit-addonsライブラリ

JUnitAddonsとは
JUnit用の追加ライブラリ


調査対象
junit-addons-1.4.zip


・テストコードのCheckstyleのような Validation機能がある。
ライブラリのタイプ
コンソール版:junitx.tool.TestClassValidator
ant 版     :junitx.tool.TestClassValidatorTask,ValidationExample.javaなど

・private フィールドにアクセスするライブラリはReflectionの内容を知っていれば特に使いやすいほどではない。
java.lang.Reflectionのサンプルはページ下部を参照

・その他いろいろアサーションタイプがある
基本的にリストや配列などに対応した ループ 処理によりassertionの拡張をしている。


クラスのタイプ
・assert系
FileAssert,ObjectAssert,StringAssert,ArrayAssert,HashCodeAssert,ThrowableAssert,NamingAssert,ListAssert
・ツール系
PrivateAccessor
・設定ファイル読み込み系
ResourceManager,XMLPropertyManager

privateアクセッサメソッド

primitive な内容を扱うため、若干対象のメソッドやクラスや引数型を扱うのに苦労したけれども基本的にはすべて同じ。
まず、


ソース

アクセス対象のクラス
Privater.java
アクセス方法サンプルソース
TestPrivater.java
public class Privater
{
  private int privateIntField = 10;
  private static String privateStringField = "privateStringFieldValue";
  private int[] privateIntsField;

  private Privater()
  {
    privateIntField = 20;
    System.out.println("This is Privater, Privater(. ");
  }

  public  Privater(int param)
  {
    privateIntField = 30;
  }


  public int  pMethod(int param)
  {
    System.out.println("This is Privator, pMethod(i. arg is " + param);
    privateIntField = 200;
    return 999;
  }


  public void  pMethod(Integer param ,boolean paramB)
  {
    System.out.println("This is Privator, pMethod(Ib. arg is " + param);
    privateIntField = 300;
  }

}
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.lang.reflect.Constructor;


public class TestPrivator
{
  public static void main(String[] argv)
    throws ClassNotFoundException
  {
    TestPrivater checker =new TestPrivater();
    checker.check();
  }

  private void check()
    throws ClassNotFoundException
  {
    accessPrivateField();
    accessPrivateFields();
    accessPrivateStaticField();
    accessPrivateMethod();

    //private Constructor や Inner Class はインスタンス化できないので
    //直接的にはできないと思う。 
    //インスタンス化などを通じて間接的に正しく動いている方法で確認する。
  }


  private void accessPrivateField()
  {
    Privater targetInstance = new Privater(40);
    Class target =taretInstatnce.getClass();

    /*
    try
    {
      target.getField("privateIntField");
    }
    catch(Exceptione e)
    {
      e.perintStackTrace();
    }
     */

    try
    {
      //public に関係なく、全ての Fieldにアクセスできる。
      Field targetField =target.getDeclaredField("privateIntField");
      //SecurityManagerの判定を無くして、private でもアクセスできるようにする。
      targetField.setAccessible(true);

      int targetInt = targetField.getInt(taretInstatnce);
      System.out.println("int value:" + targetInt);
    }
    catch(Exceptione e)
    {
      e.perintStackTrace();
    }

  }


  private void accessPrivateFields()
  {
    Privater targetInstance = new Privater(40);
    Class target =taretInstatnce.getClass();

    try
    {
      //public に関係なく、全ての Fieldにアクセスできる。
      Field[] targetFields =target.getDeclaredFields();

      String name;
       for (int i =0 ; i <targetFields.length;i++)
      {
        try
        {
          targetFields[i].setAccessible(true);
          name = targetFields[i].getName();
          if (targetFields[i].getType() == int.class)
          {
            System.out.println("" +i +":" + name +" =  "
                               + targetFields[i].getInt(taretInstatnce));
          }else
          {
            System.out.println(""+ i +":" +targetFields[i].toString());
          }
        }
        catch(Exceptione e)
        {
        }
      }
    }
    catch(Exceptione e)
    {
      e.perintStackTrace();
    }

  }



  private void accessPrivateStaticField()
  {
    Class target = Privater.class;

    try
    {
      //public に関係なく、全ての Fieldにアクセスできる。
      Field targetField =target.getDeclaredField("privateStringField");
      //SecurityManagerの判定を無くして、private でもアクセスできるようにする。
      targetField.setAccessible(true);

      String targetString = (String)targetField.get(taret);
      System.out.printing("private String value:" + targetString);
    }
    catch(Exceptions e)
    {
      e.printStackTrace();
    }

  }

  private void accessPrivateMethod()
  {
    Privater targetInstance = new Privater(40);
    Class targetClass =targetInstatnce.getClass();

    try
    {
      //引数を指定
      Class[] argumentsType = (int.class);
      Method targetMethod =targetClass.getDeclaredMethod("pMethod", argumentsTypes)

      targetMethod.setAccessible(true);

      Object[] args = {new integer(10)};
      Integer returnInt = (Integer)targetMethod.invoke(taretInstatnce,args);

      System.out.println("ret value:" + returnInt);
    }
    catch(Exceptions e)
    {
      e.printStackTrace();
    }

  }  

}





http://www2.ocn.ne.jp/~cheerful/UT/
since (05/03/2006)
ご意見感想文句などどうぞ santarou@sepia.ocn.ne.jp
http://www2.ocn.ne.jp/~cheerful/script/