我有一个私有方法,它取一个整数值列表返回一个整数值列表。我如何使用power mock来测试它。我是powermock的新手。可以用简单的模拟进行测试..?如何..
答案 0 :(得分:26)
来自the documentation,在“Common - Bypass encapsulation”一节中:
使用Whitebox.invokeMethod(..)来调用的私有方法 实例或类。
您也可以在同一部分找到示例。
答案 1 :(得分:7)
以下是完整的示例:
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());
}
答案 2 :(得分:1)
Whitebox.invokeMethod(myClassToBeTestedInstance, "theMethodToTest", expectedFooValue);
答案 3 :(得分:0)
如果您想使用Powermockito测试私有方法,并且此私有方法具有语法:
private int/void testmeMethod(CustomClass[] params){
....
}
在您的测试类方法中:
CustomClass [] params = new CustomClass [] {...} WhiteboxImpl.invokeMethod(间谍,&#34; testmeMethod&#34;,则params)
由于params,不起作用。您会收到一条错误消息,指出带有该参数的testmeMethod不存在 看这里:
WhiteboxImpl类
public static synchronized <T> T invokeMethod(Object tested, String methodToExecute, Object... arguments)
throws Exception {
return (T) doInvokeMethod(tested, null, methodToExecute, arguments);
}
对于Array类型的参数,PowerMock搞砸了。因此,请在测试方法中将其修改为:
WhiteboxImpl.invokeMethod(spy,"testmeMethod",(Object) params)
对于无参数的私有方法,您不会遇到此问题。我记得它适用于Primitve类型和包装类的参数。
&#34;了解TDD正在理解软件工程&#34;