Android Studio测试Firebase插入函数时遇Failed to release mocks错误
Android Mockito测试初始化失败问题解决求助
代码背景
我有一个FirebaseRepository文件,其中包含addDonor方法可将Donor对象添加到Firebase:
package com.example.carepro import android.util.Log import com.google.firebase.database.* class FirebaseRepository(): IFirebaseRepository { private val donorsDatabaseReference: DatabaseReference = FirebaseDatabase.getInstance().getReference("Donors") @Volatile private var INSTANCE: FirebaseRepository ?= null fun getInstance(): FirebaseRepository{ return INSTANCE ?: synchronized(this){ val instance = FirebaseRepository() INSTANCE = instance instance } } // inserting donor into database override fun addDonor(donor: Donor) : String { val newMessageId = donorsDatabaseReference.push().key var msg= "" donorsDatabaseReference.child(newMessageId!!).setValue(donor).addOnSuccessListener { msg="Success" }.addOnFailureListener{ msg="Failure" } return msg } }
Donor类文件如下:
class Donor(var contact_id: String ?= null, var name: String ?= null, var blood_group: String ?= null, var location: String ?= null, var age: Int ?= null, var gender: String ?= null, ){ fun addDonor(){ val repository: IFirebaseRepository repository = FirebaseRepository().getInstance() repository.addDonor(this) } }
为测试addDonor函数,我在androidTest目录创建了测试类,使用JUnit4和Mockito进行测试:
package com.example.carepro import com.google.firebase.database.DatabaseReference import org.junit.Assert.* import org.junit.Before import org.junit.Test import org.mockito.Mock import org.mockito.Mockito.* import org.mockito.MockitoAnnotations class FirebaseRepositoryTest { @Mock private lateinit var donorsDatabaseReference: DatabaseReference @Mock private lateinit var firebaseRepository: FirebaseRepository @Before fun setUp() { MockitoAnnotations.initMocks(this) firebaseRepository = FirebaseRepository() } @Test fun addDonor() { `when`(donorsDatabaseReference.push()).thenReturn(mock(DatabaseReference::class.java)) `when`(donorsDatabaseReference.push().key).thenReturn("fakeKey") val donor = Donor("0309-0078601", "Jack", "B+", "San Francisco", 21,"Male") val statusMessage = firebaseRepository.addDonor(donor) verify(donorsDatabaseReference).push() verify(donorsDatabaseReference.child("fakeKey")).setValue(donor) assertEquals("Success", statusMessage) } }
当前依赖配置
testImplementation 'junit:junit:4.+' testImplementation 'org.mockito:mockito-core:4.0.0' testImplementation 'com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation 'org.mockito:mockito-core:3.11.2'
出现的错误信息
org.mockito.exceptions.base.MockitoException: Failed to release mocks This should not happen unless you are using a third-part mock maker at com.example.carepro.FirebaseRepositoryTest.setUp(FirebaseRepositoryTest.kt:21) ... 26 trimmed Caused by: java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null) at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:84) at java.lang.reflect.Proxy.invoke(Proxy.java:1006) at $Proxy6.isTypeMockable(Unknown Source) at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:33) at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22) at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:250) at org.mockito.internal.creation.MockSettingsImpl.build(MockSettingsImpl.java:232) at org.mockito.internal.MockitoCore.mock(MockitoCore.java:83) at org.mockito.Mockito.mock(Mockito.java:1954) at org.mockito.internal.configuration.MockAnnotationProcessor.processAnnotationForMock(MockAnnotationProcessor.java:66) at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:27) at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:24) at org.mockito.internal.configuration.IndependentAnnotationEngine.createMockFor(IndependentAnnotationEngine.java:45) at org.mockito.internal.configuration.IndependentAnnotationEngine.process(IndependentAnnotationEngine.java:73) at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:74) at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:48) at org.mockito.MockitoAnnotations.openMocks(MockitoAnnotations.java:82) at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:100) ... 28 more Caused by: java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MockMaker implementation declared in sun.misc.CompoundEnumeration@b30560b at org.mockito.internal.configuration.plugins.PluginInitializer.loadImpl(PluginInitializer.java:57) at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:65) at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:50) at org.mockito.internal.configuration.plugins.PluginRegistry.<init>(PluginRegistry.java:26) at org.mockito.internal.configuration.plugins.Plugins.<clinit>(Plugins.java:20) at org.mockito.internal.configuration.plugins.Plugins.getAnnotationEngine(Plugins.java:67) at org.mockito.internal.configuration.GlobalConfiguration.tryGetPluginAnnotationEngine(GlobalConfiguration.java:57) at org.mockito.MockitoAnnotations.openMocks(MockitoAnnotations.java:81) ... 29 more Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:343) at org.mockito.internal.configuration.plugins.PluginInitializer.loadImpl(PluginInitializer.java:52) ... 36 more Caused by: org.mockito.exceptions.base.MockitoInitializationException: Could not initialize inline Byte Buddy mock maker. It appears as if you are trying to run this mock maker on Android which does not support the instrumentation API. IMPORTANT INFORMATION FOR ANDROID USERS: The regular Byte Buddy mock makers cannot generate code on an Android VM! To resolve this, please use the 'mockito-android' dependency for your application: https://search.maven.org/artifact/org.mockito/mockito-android Java : 0.9 JVM vendor name : The Android Project JVM vendor version : 2.1.0 JVM name : Dalvik JVM version : 0.9 JVM info : null OS name : Linux OS version : 5.15.41-android13-8-00055-g4f5025129fe8-ab8949913 at org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.<init>(InlineDelegateByteBuddyMockMaker.java:246) at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.<init>(InlineByteBuddyMockMaker.java:25) ... 39 more Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/management/ManagementFactory; at net.bytebuddy.agent.ByteBuddyAgent$ProcessProvider$ForCurrentVm$ForLegacyVm.resolve(ByteBuddyAgent.java:1302) at net.bytebuddy.agent.ByteBuddyAgent$ProcessProvider$ForCurrentVm.resolve(ByteBuddyAgent.java:1285) at net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.java:586) at net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.java:538) at net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.java:515) at org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.<clinit>(InlineDelegateByteBuddyMockMaker.java:117) ... 40 more Caused by: java.lang.ClassNotFoundException: Didn't find class "java.lang.management.ManagementFactory" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/system/framework/android.test.base.jar", zip file "/data/app/~~4dmrrQLYdCohk5d5BT9SIw==/com.example.carepro.test-klhcodpFgBmcaAXRRBUSfQ==/base.apk", zip file "/data/app/~~sLYC6Iq0LDLQa6mVBaj5bg==/com.example.carepro-BlbPivGxB50L5OxawEAqjg==/base.apk"],nativeLibraryDirectories=[/data/app/~~4dmrrQLYdCohk5d5BT9SIw==/com.example.carepro.test-klhcodpFgBmcaAXRRBUSfQ==/lib/x86_64, /data/app/~~sLYC6Iq0LDLQa6mVBaj5bg==/com.example.carepro-BlbPivGxB50L5OxawEAqjg==/lib/x86_64, /system/lib64, /system_ext/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) ... 46 more
已尝试的解决方案
- 在
androidTest\resources\mockitoExtensions\org.mockito.plugins.MockMaker文件中添加mock-maker-inline - 更新依赖到最新版本
- 添加如下带排除配置的依赖:
androidTestImplementation ('org.mockito:mockito-android:3.11.2') { exclude group: 'net.bytebuddy', module: 'byte-buddy' exclude group: 'net.bytebuddy', module: 'byte-buddy-android' }
问题
错误依旧存在,请问问题出在哪里?能否帮我解决这个问题?(我使用的是Android Studio,可能需要修改相关设置)
内容的提问来源于stack exchange,提问作者Anas Ahmad
相关产品推荐
相关产品推荐

