【问题标题】:Mockito ClassCastException after using PowerMock使用 PowerMock 后的 Mockito ClassCastException
【发布时间】:2018-01-13 18:33:32
【问题描述】:

successfully integrating PowerMock into my project 之后,我遇到了这个错误:ClassCastException occurred while creating the mockito mock。我找到了solution,但它不起作用。运行测试时,模拟某些 JRE 类的类中出现错误。如果我删除了使用 verifyStatic () 的测试,那么错误就会消失。如果我单独运行有错误的测试,一切正常。 我试过了:

1) 在Core 模块的测试文件夹中,我添加了包org.mockito.configurationMockitoConfigutation。 如果我运行调试器并将停止点设置为enableClassCache() 方法,它会在我运行测试时停止,这意味着该类按预期工作。

2) 在有错误的类上添加@PowerMockIgnore({"*.*"})注解。

有错误的示例类:

@PowerMockIgnore({"*.*"})
public class PersonTest extends AbsTest {
    @BeforeClass
    protected void setUp() throws Exception {
        mock(ArrayList.class);
    }
}

build.gradleCore 模块上:

...
testCompile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
testCompile "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion"
testCompile 'org.testng:testng:6.13.1'
testCompile "org.mockito:mockito-core:2.8.9"
testCompile "org.powermock:powermock-api-mockito2:1.7.3"
testCompile "org.powermock:powermock-module-testng:1.7.3"
testCompileOnly "org.projectlombok:lombok:1.16.18"
...

错误:

org.mockito.exceptions.base.MockitoException: ClassCastException 在创建 mockito 模拟时发生:要模拟的类: 'com.brashmonkey.spriter.Animation',由类加载器加载: 'sun.misc.Launcher$AppClassLoader@18b4aac2' 创建的类: 'com.brashmonkey.spriter.Animation$MockitoMock$1309622717',由加载 类加载器: 'net.bytebuddy.dynamic.loading.MultipleParentClassLoader@185f7840'
代理实例类: 'com.brashmonkey.spriter.Animation$MockitoMock$1309622717',由加载 类加载器: 'net.bytebuddy.dynamic.loading.MultipleParentClassLoader@185f7840'
实例创建者:ObjenesisInstantiator

您可能会遇到类加载问题,请询问 mockito 邮件列表。

在 ru.coolone.adventure_emulation.scripts.person.PersonTest.setUpClass(PersonTest.java:160) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124) 在 org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:59) 在 org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:451) 在 org.testng.internal.Invoker.invokeConfigurations(Invoker.java:222) 在 org.testng.internal.Invoker.invokeConfigurations(Invoker.java:142) 在 org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:163) 在 org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:105) 在 org.testng.TestRunner.privateRun(TestRunner.java:648) 在 org.testng.TestRunner.run(TestRunner.java:505) 在 org.testng.SuiteRunner.runTest(SuiteRunner.java:455) 在 org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450) 在 org.testng.SuiteRunner.privateRun(SuiteRunner.java:415) 在 org.testng.SuiteRunner.run(SuiteRunner.java:364) 在 org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 在 org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84) 在 org.testng.TestNG.runSuitesSequentially(TestNG.java:1187) 在 org.testng.TestNG.runSuitesLocally(TestNG.java:1116) 在 org.testng.TestNG.runSuites(TestNG.java:1028) 在 org.testng.TestNG.run(TestNG.java:996) 在 org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72) 在 org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:127) 引起:java.lang.ClassCastException: com.brashmonkey.spriter.Animation$MockitoMock$1309622717 不能 投射到 org.mockito.internal.creation.bytebuddy.MockAccess 在 org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMock(SubclassByteBuddyMockMaker.java:48) 在 org.powermock.api.mockito.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:50) 在 org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMethodInvocationControl(DefaultMockCreator.java:116) 在 org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMock(DefaultMockCreator.java:69) 在 org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.mock(DefaultMockCreator.java:46) 在 org.powermock.api.mockito.PowerMockito.mock(PowerMockito.java:138) ... 26 更多

【问题讨论】:

    标签: unit-testing libgdx mocking mockito objenesis


    【解决方案1】:

    好的,所以我有同样的行为,这是行:

    @PowerMockIgnore({"*.*"})
    

    这将忽略导致问题的org.mockito.*。更具体地说明被忽略的内容,例如:

    @PowerMockIgnore({"org.robolectric.", "android.", "com.sun.org.apache.xerces.internal.jaxp.*"})

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多