はじめまして。森口といいます。
よろしくお願いします。
On Fri, 15 Oct 2004 14:06:54 +0900
FUKUDA Fumiki <fukuda.fm@....jp> wrote:
> xUnitでテストするとき、通常はpublicなメソッドを呼んで
> その結果を検証するわけですが、時としてメソッドを呼んだ後
> 'privateメンバが狂ってないか' あるいは 'privateメソッドは
> 正しく実装されたか' を知りたくなるのです。
こんなことやって良いのかどうか&JVMのバグのような気もしますが、
JVM(1.4.2, 1.5.0)は実行時にアクセス限定子を見ていないようなので
テストクラスのコンパイル時にjavacを騙してやればTargetのprivateメソッドを呼び出せました。
---Target.java (テスト対象クラス)
public class Target {
private static String getSecretValue() { return "秘密な値"; }
}
---Target.java.public (テスト対象クラスのメンバをpublicにしたクラス、*クラス名同じ*)
public class Target {
public static String getSecretValue() { return "秘密だけどpublicな値"; }
}
---TargetTest.java (テストクラス)
public class TargetTest {
public static void main(String[] args) {
testGetSecretValue();
}
public static void testGetSecretValue() {
System.out.println(Target.getSecretValue());
}
}
※Windowsです。
C:\...\PrivateTest>javac Target.java TargetTest.java
TargetTest.java:6: getSecretValue() は Target で private アクセスされます。
System.out.println(Target.getSecretValue());
^
エラー 1 個
C:\...\PrivateTest>rename Target.java Target.java.private #退避
C:\...\PrivateTest>rename Target.java.public Target.java #public版
C:\...\PrivateTest>javac Target.java TargetTest.java #コンパイル成功!
C:\...\PrivateTest>rename Target.java Target.java.public
C:\...\PrivateTest>rename Target.java.private Target.java
C:\...\PrivateTest>javac Target.java
C:\...\PrivateTest>java TargetTest
秘密な値
やはり面倒なことには変わりないのですが、自動化するツールがあれば
どうにか使えないかなぁ、と考えてます。
UnitTestすら実践できてないので、上記使っているわけではありません。
あしからず
--
森口宏一(MORIGUCHI Hirokazu) <kito@....jp>
http://hp.vector.co.jp/authors/VA017148/ [CPad開発]