2017-01-30 147 views
3

我有与PowerMock和Mockito兼容性的问题。抛出PowerMockRule ClassNotFoundException

我有测试类:

@ActiveProfiles("test") 
@PrepareForTest(LanguageUtils.class) 
public class MyControllerTest { 

    @Mock 
    private MyMockClass MyMockClass;  
    @Autowired 
    private MyController myController; 

    @Rule 
    public PowerMockRule rule = new PowerMockRule(); 
} 

我的POM样子:

<junit-version>4.12</junit-version> 
    <hamcrest-version>1.3</hamcrest-version> 
    <mockito-version>1.10.19</mockito-version>  
    <powermock-version>1.6.4</powermock-version> 

    <dependency> 
     <groupId>org.hamcrest</groupId> 
     <artifactId>hamcrest-all</artifactId> 
     <version>${hamcrest-version}</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-core</artifactId> 
     <version>${mockito-version}</version> 
     <exclusions> 
      <exclusion> 
       <artifactId>hamcrest-core</artifactId> 
       <groupId>org.hamcrest</groupId> 
      </exclusion> 
     </exclusions> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-api-mockito</artifactId> 
     <version>${powermock-version}</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-module-junit4</artifactId> 
     <version>${powermock-version}</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-module-junit4-rule</artifactId> 
     <version>${powermock-version}</version> 
     <scope>test</scope> 
    </dependency> 

当我尝试运行测试,我得到的ClassNotFoundException。错误导致PowerMockRule,因为当我删除这行错误消失。

完整堆栈跟踪的样子:

java.lang.RuntimeException: java.lang.ClassNotFoundException: org.powermock.classloading.DeepCloner 
    at org.powermock.api.support.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:68) 
at org.powermock.api.support.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:34) 
at org.powermock.classloading.ClassloaderExecutor.createDeepCloner(ClassloaderExecutor.java:106) 
at org.powermock.classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:88) 
at org.powermock.classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:78) 
at org.powermock.modules.junit4.rule.PowerMockStatement.evaluate(PowerMockRule.java:57) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: java.lang.ClassNotFoundException: org.powermock.classloading.DeepCloner 
at java.net.URLClassLoader.findClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Unknown Source) 
at org.powermock.api.support.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:66) 
... 20 more 

回答

5

这是PowerMock一个已知的问题(参见,例如,bug 597)。简而言之,如果您将规则模块替换为规则代理模块,它应该做到这一点。即,将以下要求:

<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-module-junit4-rule</artifactId> 
    <version>${powermock-version}</version> 
    <scope>test</scope> 
</dependency> 

有了:

<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-module-junit4-rule-agent</artifactId> 
    <version>${powermock-version}</version> 
    <scope>test</scope> 
</dependency> 
相关问题