web-dev-qa-db-ja.com

Javaでプライベートメソッドをテストするにはどうすればよいですか?

重複の可能性:プライベートメソッドを単体テストする最良の方法は何ですか?

私は初心者のプログラマーですが、単体テスト用に適切に構成されたアプリケーションを作成する方法がわかりません。後で効果的な単体テストを追加できるアプリケーションを作成したいと考えています。

問題はprivateメソッドにあります-それらはクラス外でテストすることはできません。

privateであるすべてのメソッドをprotectedに変更してこの問題を解決し、テストクラスにソースクラスを拡張させますか?または、より良い解決策はありますか?

私のソリューション(プライベートsplitLetters =>保護されたsplitLetters)は次のように機能します。

ソースクラス:

class MyClass{
  protected splitLetters(int num){
    return num+2;
  }
}

テストクラス:

class Test_MyClass extend MyClass{
  public splitLettersTest(){
  for(int i=0;i<100;i++){
    System.println(parent.splitLetters(i));
  }
 }
}

ソリューション:

  1. プライベートメソッドをテストしない-プライベートメソッドが非常に複雑なタスクを実行しているため、十分にテストする必要があり、ユーザーがアクセスできないようにする必要があるこのメソッドに。まもなく、ソリューションはプライベートメソッドを保護されたものに変更します。

  2. ネストされたクラスのテスト方法-QAがソースコードを変更するため問題

  3. Reflection-これがプライベートメソッドの呼び出しを可能にする場合、それは素晴らしいソリューションのように見えます http://www.artima.com/ suiterunner/private3.html (リフレクションを理解するためにもっと学ぶ必要があります。別のクラスからプライベートメソッドを呼び出すことができる場合、リフレクションがパブリックメソッドとプライベートメソッドを持つという考えをすべて損なうわけではありません。)

  4. プライベートメソッドを定義しない(ソリューションで示したように)-プライベートメソッドを定義する必要がある場合があるため、問題があります。

22
Yosef

プライベートメソッドをテストする必要はありません。

  • プライベートメソッドは特に実装の一部です。実装ではなく機能をテストする必要があります。クラスが公開する機能をテストする場合、単体テストに依存しながら実装を変更できます。
  • プライベートメソッドをテストする必要があると感じた場合は、プライベートメソッドを別のクラスに移動して、メソッドをパブリックにする必要があることを示しています。これにより、クラスが小さくなり、メソッドを簡単にテストできます。この新しいクラスを公開したくない場合は、package-private(デフォルトのアクセス修飾子)にすることができます。
37
Sjoerd

プライベートメソッドのテストは、機能ではなく実装のテストを意味します。 whyについて非常に慎重に検討してください。プライベートメソッドをテストしたいのですが、それらをまったくテストする必要がない場合があります。

3
PaulJWilliams

私の個人的な見解では、(可能な限り)その機能のエンドユーザーに公開されている動作のみをテストする必要があるため、プライベートメソッドはテストしないでください。

  1. このテストは、内部機能の一部が実際にソフトウェアを使用している人々にとって意味のない何かに従って「機能している」ことを示すことを除いて、何も証明しません。

  2. 内部実装を変更またはリファクタリングすると、実際に公開されている外部機能がまったく変更されていないのに、ユニットテストが失敗し始めることがあります。

もちろん、大きなプロジェクトを機能の小さなチャンクに分割することを選択することもできます。その場合、インターフェイス間のインターフェイスを単体テストすることを選択できます(たとえば、DAL実装はエンドユーザーに直接影響しません)。

3
Justin

プライベートメソッドをテストする必要はありません。パブリックメソッドをテストする場合、理論上はプライベートメソッドもテストする必要があります。

2
Kendrick