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

Mockito中@InjectMocks注入失效问题求助

解决@InjectMocks与@Spy注入不生效的问题

我来帮你分析下问题所在,以及对应的解决办法:你遇到的核心问题是手动在@Before里创建的SomeFunctionContract匿名实现,被Mockito的@Spy注解自动生成的实例覆盖了,导致你自定义的save/get逻辑根本没被执行,断点自然不会触发。

问题根源

当你在字段上标注@Spy时,Mockito会自动为这个字段创建一个Spy实例(如果是接口的话,会生成一个默认的空模拟实现),而且这个自动生成的过程是在@Before方法执行之前完成的。所以你在@Before里给someFunction赋值的操作,其实被Mockito的自动生成逻辑覆盖了,相当于白写了。

解决方案

你需要手动把自己的匿名实现包装成Spy,而不是依赖@Spy注解自动生成。具体步骤如下:

  1. 移除字段上的@Spy注解
  2. 在@Before方法里,用Mockito.spy()包裹你自定义的匿名实现,再赋值给someFunction
  3. 确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:11:10