这里,我想了解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);
}
}
如果您的单元测试不在同一程序包路径中,则可以尝试在保护状态下传递方法。
示例:
应用程序包=> myapp.services.impl测试包=> myapp.serviceS.impl
然后使用相同的程序包名称,可以使用受保护的方法进行测试。如果无法做到这一点,则应将方法传递给公众,但我不认为这是您的目标……总的来说,这是一个很好的解决方案。