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加载的类。可能发生这种情况是因为我正在使用抽象类配置它?我不能说。这些问题很难追踪。这也可能是您正在使用的框架中的不兼容之处。