使用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
相关产品推荐
相关产品推荐

