You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动