You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:04:49