匕首2如何将物体注入测试

时间:2018-11-02 11:59:44

标签: 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();
    }
}

然后我想实现

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

    @Inject
    RealmManager realmManager;
}

但是realmManager为null。如何使用Dagger 2编写简单的模块测试?我用了匕首模型,但这没有帮助。我的模块包含

@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);
    }

}

我尝试了所有来自google的方法,但是我不知道如何从图中注入对象。

2 个答案:

答案 0 :(得分:0)

覆盖您的Application类,在这里您将用TestComponent替换匕首组件实例。然后,通过覆盖需要添加测试应用程序的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) } }

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

testInstrumentationRunner "com.test.YourTestRunner"

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

答案 1 :(得分:0)

好的。 BaseVerificationQuestionnaireFragmentTest 请求字段注入,但它本身并未注入。为此,AppComponentTest 接口必须有这个1 行:

public void inject(BaseVerificationQuestionnaireFragmentTest baseVerificationQuestionnaireFragmentTest);

然后这个方法必须用在像@Before这样的地方:

TestApplication app = (TestApplication) RuntimeEnvironment.systemContext;
app.appComponentTest.inject(this);

假设 appComponentTestTestApplication 中是公开的。

我以这种方式成功地在它的测试中注入了一个 ViewModel

请原谅我的 Java。


1 就我而言,Dagger 内容位于 sharedTest 目录中,无法看到 BaseVerificationQuestionnaireFragmentTest。我创建了一个 InjectableTest 类,我的测试继承自该类,并请求在 init(即 Kotlin 代码)的 InjectableTest 块中注入。