Android中JUnit测试用Mockito出现MockHandler自定义实现异常求助
这个异常我之前在Android单元测试里也碰到过,大概率是Mockito依赖版本冲突或者MockMaker配置不兼容导致的,给你几个具体的解决思路:
1. 统一Mockito依赖版本,避免冲突
首先检查你的build.gradle(Module级别)里所有Mockito相关的依赖,确保它们使用完全相同的版本,不同版本的Mockito组件(比如mockito-core和mockito-android)混用时很容易触发这类异常。
比如统一使用最新的稳定版本:
testImplementation "org.mockito:mockito-core:4.11.0" androidTestImplementation "org.mockito:mockito-android:4.11.0"
如果你的项目是纯Android测试,优先用mockito-android而不是mockito-core,它针对Android环境做了适配,能避免不少平台相关的问题。
2. 移除冲突的MockMaker配置
如果你在src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker文件里配置了自定义MockMaker(比如mock-maker-inline),检查这个配置是否和当前Mockito版本兼容。
- 如果你不需要自定义MockMaker,直接删除这个文件,让Mockito使用默认的实现;
- 如果确实需要使用
mock-maker-inline,确保你的Mockito版本支持它(Mockito 2+开始支持,但部分旧版本可能存在兼容性问题)。
3. 简化Mockito初始化方式
你的代码里同时注释了@RunWith(MockitoJUnitRunner::class)又手动调用了MockitoAnnotations.initMocks(this),虽然这两种方式理论上可以共存,但版本冲突时容易触发问题,建议只选一种:
方式一:使用MockitoJUnitRunner(推荐)
打开注释的@RunWith(MockitoJUnitRunner::class),去掉手动初始化的代码:
import androidx.lifecycle.Observer import com.google.android.gms.maps.model.LatLng import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.verify import org.mockito.Mockito.any import org.mockito.Mockito.times import org.mockito.junit.MockitoJUnitRunner @RunWith(MockitoJUnitRunner::class) class StoreViewModelTest { @Mock lateinit var storeUseCase: StoreUseCase private lateinit var viewModel: StoreViewModel @Before fun setUp() { viewModel = StoreViewModel(storeUseCase) } @Test fun loadstore_ExecutesUseCase() { viewModel.setId(123) verify(storeUseCase, times(1)).execute(any()) } }
方式二:保留手动初始化
如果不想用Runner,确保依赖版本正确的前提下,保留MockitoAnnotations.initMocks(this),但要确认没有其他冲突的测试框架干扰。
4. 排查其他测试框架冲突
如果你的项目同时使用了PowerMock、Robolectric等测试框架,它们可能会和Mockito的MockHandler实现冲突。比如PowerMock有自己的MockMaker实现,这时候需要调整依赖,使用PowerMock兼容的Mockito版本,或者修改配置避免冲突。
内容的提问来源于stack exchange,提问作者SathMK

