【问题标题】:PowerMock ClassCastException when trying to run tests with the PowerMockRunner尝试使用 PowerMockRunner 运行测试时出现 PowerMock ClassCastException
【发布时间】:2013-04-30 22:04:19
【问题描述】:

只需将以下依赖项添加到我的 Android maven 项目中:

        <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 clean test 时,我得到了这个奇怪的类转换异常:

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 测试运行器。但它不适用于相同的测试。我的意思是,有一个带有@RunsWith(RobolectricTestRunner.class) 的类和一个带有@RunsWith(PowerMockTestRunner.class) 的新类。删除所有使用 Robolectric 注释的类时,它可以工作。

知道为什么会发生这种情况吗?

提前致谢

【问题讨论】:

  • 你的被测类有android依赖吗?所以还是它直接使用一些或父尝试实例化或调用某事或事件提及某事?

标签: android maven powermock robolectric


【解决方案1】:

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

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

  2. 我尚未对此进行测试,但您可以使用 annotation @PowerMockIgnore 使其工作。

  3. surefire 插件中的Change the fork modepertest。我没有尝试过,因为它可能会减慢测试速度。

【讨论】:

  • @PowerMockIgnore 没有帮助。我有一个类似的问题,并通过拆分测试类解决了这个问题。新的它由@RunWith(Enclosed.class) 注释并分为两个子类,其中一个由@RunWith(PowerMockRunner.class) 注释并使用power mocks,另一个子类仅使用普通的JUnit 测试而没有power mock。
  • 是的,@PowerMockIgnore 对我来说效果很好,我只需要从 PowerMock 类路径中删除一个包就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多