21

我有一个私有方法,它采用整数值列表返回整数值列表。我如何使用 power mock 来测试它。我是 powermock 的新手。我可以用简单的模拟进行测试吗..?如何..

4

4 回答 4

31

文档中,在名为“Common - Bypass encapsulation”的部分中:

使用 Whitebox.invokeMethod(..) 调用实例或类的私有方法。

您还可以在同一部分中找到示例。

于 2011-08-18T10:25:36.387 回答
11

这是一个完整的例子:

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());
 }
于 2016-04-25T07:44:09.040 回答
2
Whitebox.invokeMethod(myClassToBeTestedInstance, "theMethodToTest", expectedFooValue);
于 2016-04-03T12:45:05.853 回答
0

当您想使用 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);
    }

对于 Array 类型的参数,PowerMock 搞砸了。因此,在您的测试方法中将其修改为:

WhiteboxImpl.invokeMethod(spy,"testmeMethod",(Object) params)

对于无参数的私有方法,您没有这个问题。我记得它适用于 Primitve 类型和包装类的参数。

“理解 TDD 就是理解软件工程”

于 2018-03-23T13:27:37.353 回答