整数値のリストを取得して整数値のリストを返すプライベートメソッドがあります。パワーモックを使用してテストするにはどうすればよいですか。powermockは初めてですが、簡単なモックでテストできますか?どうやって..
4 に答える
ドキュメントから、 「共通-カプセル化のバイパス」と呼ばれるセクションで:
Whitebox.invokeMethod(..)を使用して、インスタンスまたはクラスのプライベートメソッドを呼び出します。
同じセクションで例を見つけることもできます。
これを行う方法の完全な例を次に示します。
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.powermock.reflect.Whitebox;
class TestClass {
private List<Integer> methodCall(int num) {
System.out.println("Call methodCall num: " + num);
List<Integer> result = new ArrayList<>(num);
for (int i = 0; i < num; i++) {
result.add(new Integer(i));
}
return result;
}
}
@Test
public void testPrivateMethodCall() throws Exception {
int n = 10;
List result = Whitebox.invokeMethod(new TestClass(), "methodCall", n);
Assert.assertEquals(n, result.size());
}
Whitebox.invokeMethod(myClassToBeTestedInstance, "theMethodToTest", expectedFooValue);
Powermockitoを使用してプライベートメソッドをテストする場合、このプライベートメソッドの構文は次のとおりです。
private int/void testmeMethod(CustomClass[] params){
....
}
テストクラスメソッドで:
CustomClass [] params = new CustomClass [] {...} WhiteboxImpl.invokeMethod(spy、 "testmeMethod"、params)
パラメータが原因で機能しません。その引数を持つtestmeMethodが存在しないというエラーメッセージが表示されます。次を参照してください。
WhiteboxImplクラス
public static synchronized <T> T invokeMethod(Object tested, String methodToExecute, Object... arguments)
throws Exception {
return (T) doInvokeMethod(tested, null, methodToExecute, arguments);
}
配列型の引数の場合、PowerMockはめちゃくちゃです。したがって、テストメソッドでこれを次のように変更します。
WhiteboxImpl.invokeMethod(spy,"testmeMethod",(Object) params)
パラメータのないプライベートメソッドでは、この問題は発生しません。私が覚えているように、それはタイプPrimitveタイプとラッパークラスのパラメーターに対して機能します。
「TDDを理解することはソフトウェアエンジニアリングを理解することです」