Как powermockit издевается над приватным методом - PullRequest
0 голосов
/ 05 ноября 2019

Здесь я хочу понять внутренности Powermockito. Как это издевается над приватным методом? Я думал, что он использует новый загрузчик классов для создания другой копии класса, но когда я попытался сделать то же самое, я получил исключение времени выполнения, показывающее, что 2 класса (один изначально создан загрузчиком классов System) и тот, который япереданы разные версии.

package com.concretepage.lang;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.net.MalformedURLException;

import java.net.URL;

public class MainClass {

    public static void main(String[] args) throws InstantiationException, IllegalAccessException,
    NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, MalformedURLException {
    CustomClassLoaderDemo loader = new CustomClassLoaderDemo();
    Class<?> c = loader.findClass("com.concretepage.lang.Test");
    Object ob = c.newInstance();
    Method md = c.getMethod("show");
    md.invoke(ob);
    System.out.println(c.getClassLoader());
    System.out.println(ob.getClass().getClassLoader());


    ((com.concretepage.lang.Test)ob).show();
    Test c2 = new Test();

    System.out.println(c2.getClass().getClassLoader());

    Class<?> cClass = Class.forName("com.concretepage.lang.Test");
    System.out.println(cClass.getClassLoader());

    java.net.URLClassLoader urlLoader =  java.net.URLClassLoader.newInstance(new URL[] {new URL("File://c//Users//dell//eclipse-workspace//DeemTest//src")}, loader); 
    Class<?> testRemoteClazz = urlLoader.loadClass("com.concretepage.lang.Test");

    Object obUrl = testRemoteClazz.newInstance();
    Method mdUrl = testRemoteClazz.getMethod("show");
    mdUrl.invoke(obUrl);
}

}

1 Ответ

0 голосов
/ 05 ноября 2019

Если у вашего модульного теста не тот же путь к пакету, вы можете попытаться передать свои методы в защищенный.

Пример:

app package => myapp.services.impl test package => myapp.serviceS.impl

Тогда при том же имени пакета защищенный метод будет доступен для теста. Если вы не можете этого сделать, вы должны передать этот метод общественности, но я не думаю, что это ваша цель ... Процедура в целом является хорошим решением.

...