Java のプライベート メソッドのテスト

WBOY
リリース: 2024-08-30 16:23:08
オリジナル
553 人が閲覧しました

Java テストのプライベート メソッドは、プライベート アクセス修飾子を持つメソッドとして定義され、定義クラスでのみアクセスできるように制限されており、オーバーライドの対象にならないため、子クラスでは表示されません。ただし、次のように定義できます。子クラスに同じ名前のメソッドがあり、親クラスでアクセスできますが、プライベート メソッドをパッケージ アクセスにすることでプライベート メソッドをテストすることもできます。これにより、同じパッケージ内のテスト クラスから JUnit を使用して直接テストできますが、 SuiteRunner のプライベート メソッドは、JUnit でテストするよりも簡単です。

無料ソフトウェア開発コースを始めましょう

Web 開発、プログラミング言語、ソフトウェア テスト、その他

プライベート メソッドをテストする 4 つの基本的なアプローチのリスト

JUnit を使用しているか SuiteRunner を使用しているかに関係なく、プライベート メソッドをテストするには 4 つの基本的なアプローチがあります。

1.プライベート メソッドをテストしない (間接テスト)

プライベート メソッドが非常に複雑なタスクを実行している場合があり、テストを十分にテストする必要があるため、プライベート メソッドを保護する必要があるため、ユーザーがこれらのメソッドにアクセスできないようにする必要があります。
プライベート メソッドは間接的にテストできず、それらを呼び出すパブリック メソッドに対する影響のみをテストできました。プライベート メソッドのテストは、それらのメソッドが再利用性を支援/サポートする別のクラスに移動されていることを示している可能性があります。

すでに動作していて単体テストのカバレッジが良好なプライベート メソッドを抽出する場合、テストに十分な単体テストが既に存在するため、プライベート メソッドに対してさらに単体テストを記述する必要はありません。ただし、呼び出しメソッドの前にプライベート メソッドを作成し、プライベート メソッドを作成する前に単体テストを作成したい場合は、

public class testClass
{
private String testMethod(String s)
{
return s;
}
}
ログイン後にコピー

上記のサンプル例は、プライベート メソッドのテストのみを目的としています。クラス「testClass」がある場合、それはメソッドによって「testMethod( )」として呼び出されます。その場合、そのメソッドはプライベートであり、文字列またはオブジェクトを渡すことで値を返すことができます。

2.メソッドパッケージにアクセス権を与えます

メソッド パッケージへのアクセスの付与は、JUnit でプライベート メソッドをテストする場合には問題なく機能しますが、若干コストがかかります。メソッドにプライベート アクセス修飾子がある場合、それはクラスの実装の一部になります。パッケージ内の別のクラスのクラスを使用しようとするだけの場合は、このメソッドを無視できます。これは、パッケージ アクセス メソッドを使用することで解決できます。また、クラスの非パブリック メソッドのテストは、メソッド アクセス パッケージを使用して実行できます。
アクセス修飾子を付けずにメソッド パッケージをプライベートにし、テストを同じパッケージに入れる最初の方法。これは一般的な方法ですが、別のコードが必要な場合は、2 番目の方法はメソッドをパブリックにすることです。

3.ネストされたテストクラスを使用する

Java でのプライベート メソッドのテストに関する 3 番目のことは、ネストされたテスト クラスの使用です。これは、テスト対象の実稼働クラス内に静的クラスをネストすることで実行できます。ネストされたクラスは、それを囲んでいるクラスのプライベート メンバーにアクセスできるため、プライベート メソッドを直接呼び出すことができます。静的クラス自体をパッケージ アクセスにして、ホワイト ボックス テストのロード部分にすることができます。
このネストされたテスト クラスの欠点は、部門の JAR ファイルでネストされたクラスにアクセスできないようにする場合、それを抽出するために追加の作業が必要になることです。品質アナリストがソース コードに変更を加えるため、これは問題となる可能性があります。

4.リフレクションを使用する

次はリフレクションの使用方法に移ります。プライベート メソッドのテストにリフレクションを使用する利点は、テスト コードと運用コードを明確に分離できることです。ネストされたクラスのアプローチですでに見たように、テストはクラス内でテストする必要はなく、クラスはテスト対象ですが、クラスのパッケージ レベルとパブリック メソッドを実行する他のテストと並行して配置できます。ネストされたクラスを使用するため、パッケージ アクセス レベルで追加のネストされたクラスを追加する必要はありません。

リフレクションは、実行時にメソッド、クラス、インターフェイスの動作を検査または変更するために使用される API です。リフレクション使用の欠点は、リフレクション API を使用するため、テスト コードがはるかに面倒なことです。

例: リフレクションの使用を記述する Java プログラム

コード:

import java.lang.reflect.Method;
import java.lang.reflect.Field;
class Test
{
private String s;
public Test()
{
s = "Java Testing Methods";
}
public void method1()
{
System.out.println("The string is " + s);
}
public void method2(int n)
{
System.out.println("The number is " + n);
}
private void method3()
{
System.out.println("Private method invoked");
}
}
class Reflect
{
public static void main(String args[]) throws Exception
{
Test obj = new Test();
Class cls = obj.getClass();
System.out.println("The name of class is " +
cls.getName());
System.out.println("The public methods of class are : ");
Method[] methods = cls.getMethods();
for (Method method:methods)
System.out.println(method.getName());
Method methodcall1 = cls.getDeclaredMethod("method2",
int.class);
methodcall1.invoke(obj, 19);
Field field = cls.getDeclaredField("s");
field.setAccessible(true);
field.set(obj, "JAVA");
Method methodcall2 = cls.getDeclaredMethod("method1");
methodcall2.invoke(obj);
Method methodcall3 = cls.getDeclaredMethod("method3");
methodcall3.setAccessible(true);
methodcall3.invoke(obj);
}
}
ログイン後にコピー

出力:

Java のプライベート メソッドのテスト

上記の Java プログラムでは、まず java.lang パッケージをインポートし、次にクラス内にプライベート フィールドを作成し、コンストラクターも作成する必要があります。 Method1() は引数なしのパブリック メソッドとして取得され、次に、method2() もパブリック メソッドですが、整数の引数とプライベート メソッドを使用して作成されました。method3 は取り消され、上記の 3 つのメソッドが Reflect クラスで呼び出され、出力は上記で与えられます。スクリーンショット。

結論

この記事では、プライベート メソッドを直接テストするのではなく、プライベート メソッドを呼び出すパブリック メソッドに対する影響のみをテストする必要があると結論付けています。また、テストはクラスのパブリック インターフェイスにのみアクセスすべきであるという結論に達します。プライベート メソッドをテストする場合は、リフレクティブ コードをプライベート静的クラスに配置します。

以上がJava のプライベート メソッドのテストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート