Android单元测试:Dagger 2.10+注入Mock依赖问题求助
在Dagger 2.10+中实现单元测试的Mock依赖注入
嘿,我当初刚接触Dagger 2.10+做Android单元测试时,也踩过和你一样的坑——旧版资料满天飞,但新版本的简洁写法却找不到。别担心,我来一步步拆解怎么实现你想要的测试代码!
第一步:添加必要的依赖
首先确保你的build.gradle(Module级别)里引入了Dagger测试支持库和Mockito(用来创建Mock实例):
testImplementation 'com.google.dagger:dagger:2.44.2' // 可替换为最新Dagger版本 testImplementation 'com.google.dagger:dagger-testing:2.44.2' testImplementation 'org.mockito:mockito-core:5.6.0' // 可替换为最新Mockito版本
第二步:创建测试专用的Module
我们需要一个测试模块,用来提供SomeDependency的Mock实例,替代真实业务中的依赖:
import org.mockito.Mockito; import dagger.Module; import dagger.Provides; @Module public class TestConfigurationModule { @Provides SomeDependency provideSomeDependency() { // 返回Mock实例,后续可在测试中验证它的行为 return Mockito.mock(SomeDependency.class); } }
第三步:配置测试类实现注入
这里有两种简洁的写法,选你喜欢的就行:
写法一:使用DaggerTestRule(无需替换JUnit Runner)
这种方式不需要改变默认的JUnit4 Runner,通过TestRule来完成注入:
import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import dagger.Inject; import dagger.testing.DaggerTestRule; @RunWith(JUnit4.class) public class ConfigurationUnitTest { @Rule public final DaggerTestRule daggerTestRule = new DaggerTestRule() { @Override protected Object[] createModules() { // 传入我们的测试模块 return new Object[]{new TestConfigurationModule()}; } }; @Inject SomeDependency someDependency; @Before public void setUp() { // 触发注入,把Mock依赖赋值给someDependency daggerTestRule.inject(this); } @Test public void test() { // 现在可以直接使用someDependency的Mock实例了! // 比如验证方法调用:Mockito.verify(someDependency).yourMethod(); someDependency.doSomething(); } }
写法二:使用DaggerJUnit4 Runner(更简洁)
Dagger 2.10+提供了专门的JUnit Runner,能自动帮你处理组件创建和注入:
import org.junit.Test; import org.junit.runner.RunWith; import dagger.Inject; import dagger.Component; import dagger.testing.DaggerJUnit4; @RunWith(DaggerJUnit4.class) @Component(modules = TestConfigurationModule.class) public class ConfigurationUnitTest { @Inject SomeDependency someDependency; @Test public void test() { // 直接使用注入好的Mock依赖,无需手动触发注入 someDependency.doSomething(); } }
关键说明
- 两种写法的核心都是通过测试模块提供Mock实例,Dagger负责把Mock注入到测试类的
@Inject字段中。 - 如果你的真实业务组件依赖其他模块(比如Application级别的模块),可以在测试Module中用
@Provides覆盖那些依赖,同样返回Mock实例即可。 - 后续你可以用Mockito的API(比如
when()、verify())来定义Mock的行为或者验证方法调用。
内容的提问来源于stack exchange,提问作者Raman Branavitski




