はい、これは百万ドルの質問です。 プライベートメソッドを単体テストするには?
開発者は自分のコードベースでプライベートメソッドをテストする必要がありますか? または、公開メソッドの信頼にそれらを残すことは方法です。 すべての開発者は、実際にテストすべきかどうかという独自の意見を持っています。 だから、一言で言えば、質問は”この仕事のために試すことができる良いアプローチが存在するのでしょうか?”
だから、2019年に彼のJava/kotlinベースのアプリのプライベートメソッドをテストするために、開発者が利用できるすべての可能なオプションは次のとおり:
- プライベートメソッドをテストしないでください😜(根なし、酸っぱいブドウなし)
- メソッドにパブリックアクセスを与えます😒(いいえ、私はこれ 私は良い開発者です、私はベストプラクティスに従います)
- ネストされたテストクラスを使用します😒(これはテストコードと本番コードを混在させる 私は良い開発者であり、私はベストプラクティスだけに従うことをもう一度言及する必要がありますか)
- Java Reflectionを使用してください😃(はい、これは私が それはそれほど難しいことではありません。 これは、単体テスト中に非常に便利です。注:これは、単体テストや通常のアプリケーションと同様に、スタンドアロンJavaアプリケーションとしてコードを実行する場合にのみ機能します。 Javaアプレット内でこれを実行しようとすると、SecurityManagerをいじる必要があります。 しかし、それはあなたが非常に頻繁に行う必要があるものではないので、これまでのところこのテキストから除外されています。
メソッドパラメータのリフレクションのサポートは、Java8で追加されました。 簡単に言えば、実行時にパラメータの名前を取得するためのサポートを提供します。プライベートフィールドにアクセスするには、
Class.getDeclaredField(String name)
Class.getDeclaredFields()
Class.getField(String name)
Class.getFields()
"fieldValue = The Private Value”
privateString
privateString
privateString
privateString
privateString
privateString
privateString
privateString
privateString
privateString
PrivateObject
コードサンプルの先頭に作成されたインスタンス。
メソッドPrivateObject.class.getDeclaredField("privateString")
の使用に注意してください。 プライベートフィールドを返すのはこのメソッド呼び出しです。 このメソッドは、スーパークラスで宣言されたフィールドではなく、その特定のクラスで宣言されたフィールドのみを返します。
太字の行にも注意してください。 Field.setAcessible(true)
Field
インスタンスのアクセスチェックをオフにします。 呼び出し元がこれらのスコープの一部でなくても、private、protected、またはpackageスコープであってもアクセスできるようになりました。 通常のコードを使用してフィールドにアクセスすることはできません。 コンパイラはそれを許可しません。プライベートメソッドにアクセスするには、Class.getDeclaredMethod(String name, Class parameterTypes)
Class.getDeclaredMethods()
Class.getMethod(String name, Class parameterTypes)
Class.getMethods()
メソッドはパブリックメソッドのみを返すため、機能しません。
ここでは、プライベートメソッドを持つクラスの簡単な例であり、その下にJavaリフレクションを介してそのメソッドにアクセスするコード:
public class PrivateObject {private String privateString = null;public PrivateObject(String privateString) {
this.privateString = privateString;
}private String getPrivateString(){
return this.privateString;
}
}PrivateObject privateObject = new PrivateObject("The Private Value");Method privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);privateStringMethod.setAccessible(true);String returnValue = (String)
privateStringMethod.invoke(privateObject, null);System.out.println("returnValue = " + returnValue);
このコード例では、テキストを出力します"returnValue = The Private Value”
getPrivateString()
PrivateObject
コードサ
メソッドPrivateObject.class.getDeclaredMethod("privateString")
の使用に注意してください。 Privateメソッドを返すのはこのメソッド呼び出しです。 このメソッドは、スーパークラスで宣言されたメソッドではなく、その特定のクラスで宣言されたメソッドのみを返します。
太字の行にも注意してください。 Method.setAcessible(true)
Method
インスタンスのアクセスチェックをオフにします。 呼び出し元がこれらのスコープの一部でなくても、private、protected、またはpackageスコープであってもアクセスできるようになりました。 通常のコードを使用してメソッドにアクセスすることはできません。 コンパイラはそれを許可しません。
のは、いくつかの生産レベルのコードにこの知識を試してみましょう。
ここでは、テストしたいいくつかのプライベートメソッドを含むクラスです。