在Robolectric测试中覆盖Dagger模块

时间:2013-06-20 13:46:22

标签: android robolectric dagger

我正在使用Android应用程序,我一直在使用Dagger进行依赖注入。

我正在尝试测试具有这些依赖关系之一的片段,我们称之为ProductsService

在我的Robolectric测试中,我有一个覆盖ProductsService的测试模块:

    @Module(
        includes = ProductsModule.class,
        injects = {
                Fragment.class,
                FragmentTest.class
        },
        overrides = true
)
static class MockProductsModule {
    @Provides
    @Singleton
    public ProductsService providesProductsService() {
        return Mockito.mock(ProductsService.class);
    }
}

在我的测试中,为了运行我的片段,我按如下方式构建它(如How can I test fragments with Robolectric?所示)

        FragmentActivity activity = Robolectric.buildActivity(FragmentActivity.class)
            .create()
            .start()
            .resume()
            .get();

    FragmentManager fragmentManager = activity.getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(fragment, null);
    fragmentTransaction.commit();

问题是,在创建过程中,它会调用Dagger来满足它的依赖关系:

((MyApplication)getActivity().getApplication()).inject(this);

如何覆盖创建片段时创建的对象图,以使用我在测试中声明的MockProductsModule

1 个答案:

答案 0 :(得分:12)

我想你是在Application.onCreate()中创建对象图。如果是这种情况,如果您正在使用Robolectric 2,您可以按照here的说明创建一个测试应用程序,并使用您的测试模块为您的测试创建一个对象图(prod和测试应用程序必须从相同的基类继承) )。有关详细信息,您可以查看here。希望它有所帮助。