Index: [Article Count Order] [Thread]

Date:  Mon, 18 Oct 2004 01:47:32 +0900
From:  MORIGUCHI Hirokazu <kito@....jp>
Subject:  [XP-jp:05086] Re: DbC on Java/C#...
To:  extremeprogramming-jp@....jp
Message-Id:  <20041018013112.FAE9.KITO@....jp>
In-Reply-To:  <200410150511.i9F5BmN27653@....jp>
References:  <200410150511.i9F5BmN27653@....jp>
X-Mail-Count: 05086

はじめまして。森口といいます。
よろしくお願いします。

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開発]