Тестирование приватного метода с использованием power mock, который возвращает список целых чисел - PullRequest
19 голосов
/ 18 августа 2011

У меня есть приватный метод, который принимает список целочисленных значений, возвращает мне список целочисленных значений. Как я могу использовать макет, чтобы проверить это. Я новичок в Powermock. Могу ли я сделать тест с легким макетом? как ..

Ответы [ 4 ]

26 голосов
/ 18 августа 2011

Из документации , в разделе «Общее - обходная инкапсуляция»:

Используйте Whitebox.invokeMethod (..) для вызова частного метода экземпляр или класс.

Вы также можете найти примеры в этом же разделе.

7 голосов
/ 25 апреля 2016

Вот полный пример того, как это сделать:

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());
 }
1 голос
/ 03 апреля 2016
Whitebox.invokeMethod(myClassToBeTestedInstance, "theMethodToTest", expectedFooValue);
0 голосов
/ 23 марта 2018

Если вы хотите протестировать закрытый метод с Powermockito, и этот закрытый метод имеет синтаксис:

private int/void testmeMethod(CustomClass[] params){
....
}

в вашем методе класса тестирования:

CustomClass [] params = new CustomClass []{...} WhiteboxImpl.invokeMethod (spy, "testmeMethod", 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 типа и класса-оболочки.

«Понимание TDD - это понимание Software Engineering»

...