MockK模拟返回List类型方法时抛出IncompatibleClassChangeError异常
解决MockK模拟Student类时getMarks()方法抛出IncompatibleClassChangeError的问题
问题原因
这个错误是因为MockK生成代理类时,错误地尝试让List_1_Proxy继承List接口(Java不允许类继承接口,代理类应实现接口而非继承),通常出现在Android环境下DX编译器兼容问题或MockK版本缺陷场景中。
解决方案
方案1:使用MockK专属的returnsList方法
MockK针对列表类型提供了专门的返回方法,可规避接口代理生成的问题:
@Test fun test1(){ val student = mockk<Student>() every { student.getMarks() }.returnsList(listOf("9","5")) student.getMarks() }
方案2:返回具体的List实现类
直接返回ArrayList这类具体实现类,替代listOf()生成的不可变列表(避免MockK类型推断异常):
@Test fun test1(){ val student = mockk<Student>() every { student.getMarks() }.returns(arrayListOf("9","5")) student.getMarks() }
方案3:升级MockK版本
旧版本MockK存在这类代理生成bug,升级到最新稳定版可解决问题。例如在Gradle中更新依赖:
testImplementation "io.mockk:mockk:1.13.8" // 替换为当前最新稳定版本
方案4:启用放松模拟(Relaxed Mock)
若无需严格验证所有调用,可使用放松模拟模式,绕过部分类型代理问题:
@Test fun test1(){ val student = mockk<Student>(relaxed = true) every { student.getMarks() }.returns(listOf("9","5")) student.getMarks() }
内容的提问来源于stack exchange,提问作者Aada
相关产品推荐
相关产品推荐

