2015-10-20 127 views
0

我想模拟一个内部调用私有方法的方法。这个私有方法使用classloader.getclass方法读取一个文件并填充一个列表,该列表是该类的静态变量。我尝试了所有可能的方法来嘲笑这种私人方法,但似乎并不奏效。嘲笑一个私人方法

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

    public XYZ generateList(Abc abc) throws Exception { 
     populateList(); 
    } 

    private populateList() { 
     ClassLoader classLoader = TestLoad.class.getClassLoader(); 
     File listfile = new File(classLoader.getResource(
     filename).getFile()); 
     List <String> localList = new ArrayList <String>(); 

     try (Scanner scanner = new Scanner(listfile)) { 
      while (scanner.hasNextLine()) { 
       String text = scanner.nextLine(); 
       localList.add(text.trim()); 
      } 
      scanner.close(); 
     } catch (IOException e) {} 
     return localList; 
    } 
} 

我试图模拟populateList()但控制进入该方法的所有时间。我几乎尝试了所有的选项在网上双方及的Mockito但powermock它似乎并没有work.My的Junit不会是如下

级开始有@RunWith(PowerMockRunner.class) @PrepareForTest(TestLoad.class ) ArrayList testList = new ArrayList(); testList.add(“00”); TestLoad实例= PowerMock.createPartialMock(TestLoad.class,“populateList”); PowerMock.expectPrivate(instance,“populateList”)andReturn(testList); PowerMock.replay(instance);

下面是日志以供参考:

java.lang.IllegalStateException:无法用名com.xyz.TestLoad改造类。原因:java.io.IOException:无效的常量类型:17 at 17 at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:266) at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader .java:180) at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:68) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0 (本机方法) 在java.lang.Class.forName(Class.java:348) 在org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:145) 的组织。 powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegat orFromClassloader(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(本机方法)

+1

后的测试代码你都试过了。你在这里发布的代码有很多编译错误。 – kswaughs

+0

下面是代码TestLoad实例= PowerMock \t \t \t \t .createPartialMock(TestLoad.class, \t \t \t \t \t \t “populateList”); \t \t PowerMock.expectPrivate(例如, “populateList”)andReturn( \t \t \t \t testList)。 \t \t PowerMock.replay(instance); –

回答

0

后我找到了很多研究解决方案。我们需要将以下添加为依赖在pom.xml防止这种错误... **

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

**

0

你的测试代码看起来像您使用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; 
} 
} 

测试Java类

import java.util.ArrayList; 
import java.util.List; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Matchers; 
import org.mockito.Mockito; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@PrepareForTest(TestLoad.class) 
@RunWith(PowerMockRunner.class) 
public class TestLoadTest { 

@Test 
public void testPrivateMethod() throws Exception{ 

    List<String> testList = new ArrayList<String>(); 
    testList.add("00"); 

    TestLoad mockInstance = PowerMockito.spy(new TestLoad()); 

    PowerMockito.doReturn(testList).when(mockInstance, "populateList"); 

    List<String> outputList = mockInstance.generateList(new Abc()); 

    System.out.println("test output:" + outputList); 

    PowerMockito.verifyPrivate(mockInstance, Mockito.times(1)).invoke("populateList"); 

} 

} 

控制台输出:

generateList method is called 
test output:[00] 
+0

我已经试过这种方法,它给了我在上面的帖子中提到的同样的错误。这里的问题是不同的。经过大量的研究,我找到了解决方案。我们需要增加以下内容作为在pom.xml依赖... \t \t \t org.javassist \t Javassist是 \t 3.18.2-GA \t