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

无法通过Dagger注入Mock,如何在单元测试中使用Dagger Module预定义值创建实例

单元测试中获取Dagger Module带默认参数实例的实现方案

你当前的测试代码直接Mock了AutoCloseCountDownTimer本身,所有方法都是模拟实现,自然无法拿到Dagger预定义的构造参数。你只需要Mock这个类的依赖项,再通过Module的构造逻辑生成真实实例即可,有两种常用实现方式:

方案1:直接调用Module方法(轻量优先,单元测试推荐)

这个方案不需要额外搭建Dagger组件,直接复用Module的构造逻辑:

@RunWith(MockitoJUnitRunner.class)
public class AutoCloseCountDownTimerTest {

    // 只Mock AutoCloseCountDownTimer的依赖项
    @Mock
    private UserInteractionClient mockUserInteractionClient;
    @Mock
    private RxPositionManager mockRxPositionManager;
    
    // 持有真实实例,携带Dagger预定义的默认参数
    private AutoCloseCountDownTimer realTimer;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        // 直接调用Module的provider方法,传入mock依赖,得到带默认参数的真实实例
        realTimer = new AutoCloseCountDownTimerModule().getAutoCloseCountDownTimer(mockUserInteractionClient, mockRxPositionManager);
    }

    @Test
    public void basicTest() {
        final AutoCloseCountDownTimer.Listener mockListener = Mockito.mock(AutoCloseCountDownTimer.Listener.class);
        realTimer.registerListener(mockListener);

        final int expectedValue = 10;
        realTimer.notifyOnAutoClose(expectedValue);
        Mockito.verify(mockListener).onAutoClose(expectedValue);
    }
}

方案2:搭建测试用Dagger组件(多依赖注入场景适用)

如果你的测试场景需要注入多个Dagger管理的实例,可以搭建专属测试组件:

  1. 新增测试依赖Module,提供mock的依赖项:
@Module
class TestDependencyModule {
    @Provides
    @Singleton
    fun provideUserInteractionClient(): UserInteractionClient = Mockito.mock(UserInteractionClient::class.java)

    @Provides
    @Singleton
    fun provideRxPositionManager(): RxPositionManager = Mockito.mock(RxPositionManager::class.java)
}
  1. 定义测试Component,关联业务Module和测试依赖Module:
@Singleton
@Component(modules = [AutoCloseCountDownTimerModule::class, TestDependencyModule::class])
interface TestComponent {
    fun inject(test: AutoCloseCountDownTimerTest)
}
  1. 测试类中注入实例:
@RunWith(MockitoJUnitRunner.class)
public class AutoCloseCountDownTimerTest {

    @Inject
    AutoCloseCountDownTimer realTimer;

    @Before
    public void setUp() {
        // 编译后生成的DaggerTestComponent直接注入即可
        DaggerTestComponent.create().inject(this);
    }

    // 测试逻辑和方案1一致
}

注意事项

  • 如果需要测试计时逻辑,建议搭配RxJava的TestScheduler或者Mockito的时间模拟能力,避免真实等待计时
  • 如果需要部分mockAutoCloseCountDownTimer的方法,可以用Mockito的spy包装生成的真实实例,保留原有逻辑的同时自定义部分方法返回值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:06:04