powermockit如何模拟私有方法

问题描述 投票:0回答:1

这里,我想了解Powermockito的内部。如何模拟私有方法?我以为它使用新的类加载器来创建该类的不同副本,但是当我尝试执行相同操作时,我遇到了一个运行时异常,该异常显示了两个类(一个最初由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);
}

}

classloader powermock
1个回答
0
投票

如果您的单元测试不在同一程序包路径中,则可以尝试在保护状态下传递方法。

示例:

应用程序包=> myapp.services.impl测试包=> myapp.serviceS.impl

然后使用相同的程序包名称,可以使用受保护的方法进行测试。如果无法做到这一点,则应将方法传递给公众,但我不认为这是您的目标……总的来说,这是一个很好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.