使用返回整数列表的power mock测试私有方法

时间:2011-08-18 09:12:23

标签: java easymock powermock

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

4 个答案:

答案 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;