无法通过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管理的实例,可以搭建专属测试组件:
- 新增测试依赖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) }
- 定义测试Component,关联业务Module和测试依赖Module:
@Singleton @Component(modules = [AutoCloseCountDownTimerModule::class, TestDependencyModule::class]) interface TestComponent { fun inject(test: AutoCloseCountDownTimerTest) }
- 测试类中注入实例:
@RunWith(MockitoJUnitRunner.class) public class AutoCloseCountDownTimerTest { @Inject AutoCloseCountDownTimer realTimer; @Before public void setUp() { // 编译后生成的DaggerTestComponent直接注入即可 DaggerTestComponent.create().inject(this); } // 测试逻辑和方案1一致 }
注意事项
- 如果需要测试计时逻辑,建议搭配RxJava的
TestScheduler或者Mockito的时间模拟能力,避免真实等待计时 - 如果需要部分mock
AutoCloseCountDownTimer的方法,可以用Mockito的spy包装生成的真实实例,保留原有逻辑的同时自定义部分方法返回值
内容的提问来源于stack exchange,提问作者KinderDev
相关产品推荐
相关产品推荐

