2013-04-30 143 views
0

只需添加以下依赖于我的Android Maven项目:PowerMock ClassCastException异常试图与PowerMockRunner运行测试时

 <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-api-mockito</artifactId> 
      <version>${powermock.version}</version> 
      <scope>test</scope> 
     </dependency> 

然后用注释@RunsWith(PowerMockRunner.class)类

当执行MVN干净的测试,我得到这个怪异的类转换异常:

java.lang.ClassCastException: org.powermock.modules.junit4.internal.impl.PowerMockJUnit49RunnerDelegateImpl cannot be cast to org.powermock.modules.junit4.common.internal.PowerMockJUnitRunnerDelegate 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:143) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:39) 
    at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:217) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:59) 
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32) 
    at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:33) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) 
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.<init>(JUnit4TestSet.java:45) 
    at org.apache.maven.surefire.junit4.JUnit4DirectoryTestSuite.createTestSet(JUnit4DirectoryTestSuite.java:56) 
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:96) 
    at org.apache.maven.surefire.Surefire.createSuiteFromDefinition(Surefire.java:209) 
    at org.apache.maven.surefire.Surefire.run(Surefire.java:156) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338) 
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997) 

我发现,是由于在同一个测试项目的测试robolectric runne使用河但它不适用于相同的测试。我的意思是,有@RunsWith(RobolectricTestRunner.class)和@RunsWith(PowerMockTestRunner.class)的新类。删除所有使用Robolectric注解的类时,它都可以工作。

任何想法为什么会发生这种情况?

在此先感谢

+0

请问你的类在测试下有android依赖吗?所以或者它使用一些直接或父母尝试实例化或调用某些事件或事件提及的东西? – 2013-05-08 04:50:42

回答

0

通过自定义的类装载器都RobolectricPowerMock仪器代码。一些可能的解决方法:

  1. 为PowerMock测试创建一个新的Maven子模块。

  2. 我还没有测试过这个,但是你可能会使用annotation @PowerMockIgnore来使它工作。

  3. Change the fork mode在surefire-plugin中为pertest。我没有尝试过,因为它可能会减慢测试速度。

相关问题