Dagger 2 如何将对象注入测试

Pio*_*ura 6 android dependency-injection dagger-2 daggermock

我想将我的领域管理器用于单元测试模块。我做了

@Singleton
@Component(modules = {
        TestApplicationModule.class,
        AndroidSupportInjectionModule.class,
        TestStoreDataModule.class,
        TestUtilsModule.class})
public interface AppComponentTest extends AppComponent {

    @Component.Builder
    interface Builder {

        @BindsInstance
        AppComponentTest.Builder application(Application application);

        AppComponentTest build();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我想实现

@RunWith(RobolectricTestRunner.class)
@Config(application = TestVerioriApplication.class, sdk=27)
public class BaseVerificationQuestionnaireFragmentTest {

    @Inject
    RealmManager realmManager;
}
Run Code Online (Sandbox Code Playgroud)

但是realmManager 为空。如何使用 dagger 2 编写简单的模块测试?我使用了 dagger-mock 但它没有帮助。我的模块包含

@Module(includes = StoreDataModule.class)
public class TestStoreDataModule {

    @Provides
    @Singleton
    public static RealmConfiguration provideRealmConfiguration(RealmConstants realmConstants) {
        return new RealmConfiguration.Builder()
                .name(realmConstants.getName())
                .encryptionKey("Implement this key".getBytes())
                .schemaVersion(realmConstants.getSchemaVersion())
                .build();
    }

    @Provides
    @Singleton
    public static RealmManager provideRealmManager(RealmConfiguration realmConfiguration, SchedulerProvider schedulerProvider) {
        return new RealmManager(realmConfiguration, schedulerProvider);
    }

}
Run Code Online (Sandbox Code Playgroud)

我尝试了谷歌的所有内容,但我不知道如何从图中注入对象。

Kar*_*aka 1

覆盖您的Application类,您将在其中用 TestComponent 替换 dagger 组件实例。AndroidJUnitRunner然后通过重写需要添加测试应用程序的类来创建您自己的测试运行器:

class TestRunner : AndroidJUnitRunner() {
   @Throws(InstantiationException::class,IllegalAccessException::class,ClassNotFoundException::class)
 override fun newApplication(cl:ClassLoader,className:String, context:Context):Application {
        return super.newApplication(cl, TestApplication::class.java.name, context)
  }
}
Run Code Online (Sandbox Code Playgroud)

接下来在文件中注册您的跑步者build.gradle

testInstrumentationRunner "com.test.YourTestRunner"

现在,您只需在测试组件中替换要在测试中更改的模块的实现即可。