Junit 模拟私有方法

Junit 模拟私有方法,junit,mockito,powermock,easymock,powermockito,Junit,Mockito,Powermock,Easymock,Powermockito,我试图模拟一个在内部调用私有方法的方法。这个私有方法使用classloader.getclass方法读取一个文件,并填充一个作为类的静态变量的列表。我尝试了所有可能的方法来模拟这个私有方法,但它似乎不起作用 类TestLoad{ 私有静态列表myList=newarraylist(); 私有静态最终字符串filename=“/myfile.txt”; 公共XYZ生成列表(Abc)引发异常{ 大众主义者(); } 私人平民主义者(){ ClassLoader ClassLoader=TestLoa

我试图模拟一个在内部调用私有方法的方法。这个私有方法使用
classloader.getclass
方法读取一个文件,并填充一个作为类的静态变量的列表。我尝试了所有可能的方法来模拟这个私有方法,但它似乎不起作用

类TestLoad{
私有静态列表myList=newarraylist();
私有静态最终字符串filename=“/myfile.txt”;
公共XYZ生成列表(Abc)引发异常{
大众主义者();
}
私人平民主义者(){
ClassLoader ClassLoader=TestLoad.class.getClassLoader();
File listfile=新文件(classLoader.getResource(
getFile());
List localList=newarraylist();
尝试(扫描仪=新扫描仪(列表文件)){
while(scanner.hasNextLine()){
字符串文本=scanner.nextLine();
add(text.trim());
}
scanner.close();
}捕获(IOE){}
返回localList;
}
}
我试图模拟
populateList()
,但控件始终进入该方法。我尝试了mockito和powermock在网上的几乎所有选项,但似乎都不起作用

类开始时有@RunWith(PowerMockRunner.Class) @PrepareForTest(TestLoad.class) ArrayList testList=新的ArrayList(); 测试列表。添加(“00”);TestLoad实例=PowerMock.createPartialMock(TestLoad.class,“populateList”); expectPrivate(实例,“populateList”).andReturn(testList); 回放(实例)

以下是日志供参考:

java.lang.IllegalStateException:未能转换名为com.xyz.TestLoad的类。原因:java.io.IOException:无效的常量类型:17处的18 位于org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:266) 位于org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:180) 位于org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:68) 位于java.lang.ClassLoader.loadClass(ClassLoader.java:357) 位于java.lang.Class.forName0(本机方法) 位于java.lang.Class.forName(Class.java:348) 位于org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:145) 位于org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:40) 位于org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:244) 位于org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.(JUnit4TestSuiteChunkerImpl.java:61) 位于org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner。(AbstractCommonPowerMockRunner.java:32) 位于org.powermock.modules.junit4.PowerMockRunner。(PowerMockRunner.java:34) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)


您的测试代码看起来像是在使用PowerMock EasyMock。 但是你的帖子也被标记为mockito&powermockito

我使用powermockito给出以下解决方案

主Java类:

public class TestLoad {

private static List<String> myList = new ArrayList<String>();
private static final String filename = "/myfile.txt";

public List<String> generateList(Abc abc) throws Exception {

    System.out.println("generateList method is called");
    return populateList();
}

private List<String> populateList() {
    System.out.println("populateList method is called");
    ClassLoader classLoader = TestLoad.class.getClassLoader();
    File listfile = new File(classLoader.getResource(filename).getFile());
    // Read listfile and build localList logic here
    List<String> localList = new ArrayList<String>();

    return localList;
 }
}
generateList method is called
test output:[00]

经过大量研究,我找到了解决办法。我们需要在pom.xml中添加以下作为依赖项以防止此错误**

<dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.18.2-GA</version>
        </dependency>

org.javassist
javassist
3.18.2-GA

**

将您尝试过的测试代码发布出来。您在这里发布的代码有很多编译错误;expectPrivate(实例,“populateList”).andReturn(testList);回放(实例);我已经尝试过这种方法,它给了我与上面帖子中提到的相同的错误。。这里的问题有所不同。经过大量研究,我找到了解决办法。我们需要在pom.xml…org.javassist javassist 3.18.2-GA中添加以下内容作为依赖项
<dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.18.2-GA</version>
        </dependency>