Mockito中@InjectMocks注入失效问题求助
解决@InjectMocks与@Spy注入不生效的问题
我来帮你分析下问题所在,以及对应的解决办法:你遇到的核心问题是手动在@Before里创建的SomeFunctionContract匿名实现,被Mockito的@Spy注解自动生成的实例覆盖了,导致你自定义的save/get逻辑根本没被执行,断点自然不会触发。
问题根源
当你在字段上标注@Spy时,Mockito会自动为这个字段创建一个Spy实例(如果是接口的话,会生成一个默认的空模拟实现),而且这个自动生成的过程是在@Before方法执行之前完成的。所以你在@Before里给someFunction赋值的操作,其实被Mockito的自动生成逻辑覆盖了,相当于白写了。
解决方案
你需要手动把自己的匿名实现包装成Spy,而不是依赖@Spy注解自动生成。具体步骤如下:
- 移除字段上的
@Spy注解 - 在@Before方法里,用
Mockito.spy()包裹你自定义的匿名实现,再赋值给someFunction - 确保Delegator能正确拿到这个Spy实例(如果@InjectMocks没自动注入,手动赋值更稳妥)
修改后的测试代码如下:
import org.junit.Before import org.junit.Test import org.junit.Assert.assertTrue import org.mockito.Mockito.spy import org.mockito.InjectMocks class YourTestClass { lateinit var testData: String lateinit var someFunction: SomeFunctionContract @InjectMocks lateinit var delegator: Delegator @Before fun setup() { // 先创建自定义的接口实现 val customFunction = object : SomeFunctionContract { override fun save(test: String) { testData = test // 现在断点应该能正常触发了 } override fun get(): String { return testData } } // 把自定义实现包装成Spy someFunction = spy(customFunction) // 如果@InjectMocks自动注入失效,直接手动初始化Delegator(根据实际构造逻辑调整) // delegator = Delegator(someFunction) } @Test fun testSomething() { delegator.retrieve("something") // 假设这里会触发someFunction.save("hello") assertTrue(someFunction.get() == "hello") // 还可以验证方法调用情况,比如: // verify(someFunction).save("hello") } }
额外提示
- 如果Delegator的构造函数依赖
SomeFunctionContract,@InjectMocks通常会自动把你创建的Spy实例注入进去;如果自动注入没生效,直接手动在@Before里初始化Delegator是最可靠的方式。 - 如果你需要验证方法的调用次数、参数等交互逻辑,可以用Mockito的
verify方法,这样能更精准地测试代码的行为。
内容的提问来源于stack exchange,提问作者Jono
相关产品推荐
相关产品推荐

