[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
質問
内部のプライベートメソッドやフィールド、ネストされたクラスを持つクラスを 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;
このようにして、あなたのコードは型安全で読みやすいままです。 設計に妥協したり、テストのためにメソッドやフィールドを過剰に露出させたりすることもありません。
レガシーをお持ちの場合 ジャバ アプリケーションで、メソッドの可視性を変更することが許されていない場合、プライベートメソッドをテストするための最良の方法は リフレクション .
内部的には、ヘルパーを使って
private
と
private static
を呼び出すだけでなく
private
と
private 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)
は、プライベートを弄るために必要です。
関連
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] フェイク、モッキング、スタビングの違いとは?
-
[解決済み] C# "internal "アクセス修飾子でユニットテストを行う場合
-
[解決済み] プライベートメソッドのユニットテストはどのように行うのですか?
-
[解決済み] 抽象クラスをユニットテストする方法:スタブで拡張する?
-
[解決済み] なぜJUnitはassertNotEqualsメソッドを提供しないのですか?
-
[解決済み] JUnit 4で条件付きでテストを無視する
-
[解決済み】典型的なテストディレクトリ構造でunittestを実行する
-
[解決済み】Javaで異なるクラスからプライベートフィールドの値を読み取る方法は?
-
[解決済み】Javaです。System.exit()を呼び出すメソッドをテストするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
スタイルが読み込まれず、ブラウザのコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
SpringBootApplication を型解決できない。
-
プロジェクトの依存関係を解決できなかった 解決
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
[解決済み] プライベートメソッドのユニットテスト [重複] [重複