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

使用Mockito创建TaskFactory Mock时触发NotAMockException求助

解决Mockito Kotlin中Mock对象变为真实实例的问题

问题重现

创建Mock对象:

private val mockTaskFactory = mock<TaskFactory>()

在@BeforeEach方法中进行桩配置:

@BeforeEach fun setupTaskFactory() {
  doAnswer { ... }.whenever(mockTaskFactory).create(any<UUID>(), any<Boolean>(), any<Int>())
}

运行时抛出错误:

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to when() is not a mock!
Example of correct stubbing:
    doThrow(new RuntimeException()).when(mock).someMethod();

调试确认,setupTaskFactory执行时mockTaskFactory是TaskFactory的真实实例,而非预期的Mock对象。

可能的原因及解决方案

1. 未正确使用Mockito Kotlin扩展

若直接使用Mockito核心库的mock方法,在Kotlin中处理默认final的类/接口时会失效,导致生成真实实例而非Mock对象。

解决方式:
确保导入org.mockito.kotlin.mock,并引入mockito-kotlin依赖(Gradle示例):

testImplementation "org.mockito.kotlin:mockito-kotlin:4.1.0"

2. TaskFactory是final类且未开启Mock支持

Kotlin默认所有类为final,Mockito默认无法Mock final类,此时mock<TaskFactory>()会返回真实实例(若类有无参构造)。

解决方式:
在src/test/resources/mockito-extensions目录下创建文件org.mockito.plugins.MockMaker,文件内容为:

mock-maker-inline

该配置让Mockito支持Mock final类与方法。

3. 变量被意外重新赋值

检查测试类中是否有其他代码对mockTaskFactory进行了重新赋值,比如初始化块、其他方法中覆盖了该变量的Mock实例。

4. JUnit实例化策略冲突

若使用JUnit 5并设置了@TestInstance(TestInstance.Lifecycle.PER_CLASS),需确保mockTaskFactory的初始化逻辑不会因实例复用导致失效,可考虑将Mock对象的初始化移至@BeforeEach方法内。

内容的提问来源于stack exchange,提问作者mjaggard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:16:03