Kotlin ClassCastException:io.realm.realm不能强制转换为io.realm.realm

Kotlin ClassCastException:io.realm.realm不能强制转换为io.realm.realm,kotlin,mockito,realm,powermock,powermockito,Kotlin,Mockito,Realm,Powermock,Powermockito,我试图模拟一个领域实例。我的实现是成功的,但是在一起运行多个测试时失败了。 下面是创建模拟领域实例的类的实现 import android.os.Build import io.realm.Realm import org.junit.Before import org.junit.runner.RunWith import io.realm.RealmConfiguration import io.realm.RealmQuery import io.realm.RealmResults i

我试图模拟一个领域实例。我的实现是成功的,但是在一起运行多个测试时失败了。 下面是创建模拟领域实例的类的实现

import android.os.Build
import io.realm.Realm
import org.junit.Before
import org.junit.runner.RunWith

import io.realm.RealmConfiguration
import io.realm.RealmQuery
import io.realm.RealmResults
import io.realm.log.RealmLog
import io.realm.internal.RealmCore
import org.hamcrest.CoreMatchers
import org.hamcrest.MatcherAssert
import org.junit.Rule
import org.mockito.ArgumentMatchers
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PowerMockIgnore
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.powermock.modules.junit4.rule.PowerMockRule
import org.robolectric.RobolectricTestRunner
import org.powermock.api.mockito.PowerMockito.mockStatic
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config

@RunWith(value = RobolectricTestRunner::class)
@PowerMockRunnerDelegate(value = RobolectricTestRunner::class)
@Config(sdk = [Build.VERSION_CODES.O_MR1])
@PowerMockIgnore(value = ["org.robolectric.*", "org.mockito.*", "android.*", "javax.net.ssl.*", "javax.security.*", "javax.crypto.*"])
@SuppressStaticInitializationFor("io.realm.internal.Util")
@PrepareForTest(value = [Realm::class, RealmConfiguration::class, RealmQuery::class, RealmResults::class, RealmCore::class, RealmLog::class])
abstract class RealmPresenterTest { //Does not make difference as open class

  var mockRealm: Realm? = null

  @Rule @JvmField var rule = PowerMockRule()

  @Before open fun setUp() {
    mockStatic(RealmCore::class.java)
    mockStatic(RealmLog::class.java)
    mockStatic(Realm::class.java)
    mockStatic(RealmConfiguration::class.java)
    RealmCore.loadLibrary(RuntimeEnvironment.application)
    Realm.init(RuntimeEnvironment.application)

    val mockRealm = PowerMockito.mock(Realm::class.java)
    val mockRealmConfig = PowerMockito.mock(RealmConfiguration::class.java)

//    doNothing().`when`(RealmCore::class.java)
    PowerMockito.whenNew(RealmConfiguration::class.java).withAnyArguments().thenReturn(mockRealmConfig)
    PowerMockito.`when`(Realm.getInstance(ArgumentMatchers.any(RealmConfiguration::class.java))).thenReturn(mockRealm)
    PowerMockito.`when`(Realm.getDefaultInstance()).thenReturn(mockRealm)

    this.mockRealm = mockRealm

    MatcherAssert.assertThat(Realm.getDefaultInstance(), CoreMatchers.`is`(mockRealm))
  }

}
该类在使用该模拟领域实例的另一个类中进行扩展。如果我运行类测试本身,测试是否正常工作。 但是,如果同时运行多个测试(例如运行包含多个类的文件夹),则会出现以下错误:

发生异常时:

val mockRealm = PowerMockito.mock(Realm::class.java)
例外情况:

java.lang.ClassCastException: io.realm.Realm cannot be cast to io.realm.Realm

    at com.app.RealmPresenterTest.setUp(RealmPresenterTest.kt:49)
    at com.app.SomePresenterTest.setUp(SomePresenterTest.kt:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    at org.junit.internal.runners.statements.RunBefores.invokeMethod(RunBefores.java:33)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.powermock.modules.junit4.rule.PowerMockStatement$1.run(PowerMockRule.java:83)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:1854)
    at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:816)
    at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:681)
    at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:401)
    at org.powermock.classloading.AbstractClassloaderExecutor.getResult(AbstractClassloaderExecutor.java:76)
    at org.powermock.classloading.AbstractClassloaderExecutor.invokeWithClassLoader(AbstractClassloaderExecutor.java:64)
    at org.powermock.classloading.AbstractClassloaderExecutor.executeWithClassLoader(AbstractClassloaderExecutor.java:56)
    at org.powermock.classloading.SingleClassloaderExecutor.execute(SingleClassloaderExecutor.java:33)
    at org.powermock.classloading.AbstractClassloaderExecutor.execute(AbstractClassloaderExecutor.java:40)
    at org.powermock.modules.junit4.rule.PowerMockStatement.evaluate(PowerMockRule.java:75)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:305)
    at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:546)
    at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:252)
    at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

如果涉及多个
类装入器,我会记得看到这样的错误消息。不确定它们在您的情况下来自何处。您指的是
类加载器的多个版本
?不一定。当您有加载某些类的
ClassLoader a
和加载相同类的
ClassLoader B
时,就会出现问题。在代码中的某个地方,您现在尝试将一个由从a加载的类构造的对象强制转换为由B加载的类。可能发生这种情况是因为我正在使用抽象类配置它?我不能说。这些问题很难追踪。这也可能是您正在使用的框架中的不兼容之处。