1. ホーム
  2. java

[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?

2022-03-14 16:18:49

質問

内部のプライベートメソッドやフィールド、ネストされたクラスを持つクラスを JUnit でテストするにはどうすればよいですか?

テストを実行できるようにするために、メソッドのアクセス修飾子を変更するのは悪いことだと思うのですが。

どのように解決するのですか?

<ブロッククオート

更新してください。

それから約10年、プライベートメソッドやアクセスできないメンバーをテストするのに最適な方法は @Jailbreak からの マニホールド フレームワークを使用します。

@Jailbreak Foo foo = new Foo();
// Direct, *type-safe* access to *all* foo's members
foo.privateMethod(x, y, z);
foo.privateField = value;

このようにして、あなたのコードは型安全で読みやすいままです。 設計に妥協したり、テストのためにメソッドやフィールドを過剰に露出させたりすることもありません。

レガシーをお持ちの場合 ジャバ アプリケーションで、メソッドの可視性を変更することが許されていない場合、プライベートメソッドをテストするための最良の方法は リフレクション .

内部的には、ヘルパーを使って privateprivate static を呼び出すだけでなく privateprivate static メソッドを使用します。以下のパターンを使えば、プライベートなメソッドやフィールドに関連することはほとんど何でもできるようになります。もちろん private static final 変数をリフレクションで使用することができます。

Method method = TargetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);

そして、フィールドの場合。

Field field = TargetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);


注意事項
1. TargetClass.getDeclaredMethod(methodName, argClasses) を覗くことができます。 private メソッドを使用します。同じことが getDeclaredField .
2. は setAccessible(true) は、プライベートを弄るために必要です。