DaggerMock - 如何让匕首在测试用例中提供对象

时间:2017-06-11 16:46:31

标签: android junit mockito dagger-2 daggermock

我正在使用dagger2对我拥有的用例(如果重要的MVP架构)进行junit测试。   问题是我想有时在我的junit测试用例中使用Dagger2注入。   所以我查看了DaggerMock库。我有一个我想为我构建的依赖,但它一直返回null。   让我告诉你我是如何设置匕首的。

它是一个单独的组件(尝试过的子组件,但是daggerMock对它不满意): AppComponent.java:

@Singleton
@Component(modules = {AppModule.class, NetworkModule.class, RepositoryModule.class, UseCaseModule.class, ActivityModule.class, PresenterModule.class})
public interface AppComponent {
    void inject(NetworkSessionManager target);
    void inject(SplashActivity target);
    void inject(AuthenticationActivity target);
    void inject(WelcomeActivity target);
    void inject(LoginFragment target);
}

其余的类都使用@inject注释。如果你使用@Inject注释类构造函数,那么它就意味着你没有必要 在上面的AppComponent界面中对它进行delcare。

所以这是我对DaggerMock的测试用例:

    @Rule
   public final DaggerMockRule<AppComponent> rule = new DaggerMockRule<>(AppComponent.class, new AppModule(null),new RepositoryModule(),new NetworkModule(),new UseCaseModule());


    StandardLoginInfo fakeLoginInfo;
    TestObserver<Login> subscriber;

    DoStandardLoginUsecase target_standardLoginUsecase;//this is what im trying to test so its real

    @InjectFromComponent
    UserDataRepository userDataRepository; //id like this to be a real instance also but it keeps showing as null 

    @Before
    public void setUp() throws Exception {

        target_standardLoginUsecase = new DoStandardLoginUsecase(userDataRepository); // this gets passed a null, why ?
        subscriber = TestObserver.create();
    }

//....

}

如果我们看一下我定义的规则我包含了appcomponent中的所有模块,所以我认为我可以使用所有依赖项。 我把它作为预期的上下文传递给了AppModule,我不认为这是一个大问题。

我虽然@InjectFromComponent注释会给我我想要的东西。我甚至试过@InjectFromComponent(DoStandardLoginUsecase.class)但这不起作用。我希望它进入AppComponent android 为我构建一个UserDataRepository对象。由于我使用的是DaggreMockRule中的所有模块,我认为这样做不会很难吗?

我怎样才能让dagger2为我建造一个真实的物体?

1 个答案:

答案 0 :(得分:1)

这里的技巧是,无论你想要注入什么,都必须直接暴露在组件中。例如,让你的组件像这样:

@Singleton
@Component(modules = {AppModule.class, TestNetworkModule.class, RepositoryModule.class, ActivityModule.class})
public interface TestAppComponent {

    void inject(LoginFragment target);
    void inject(SignUpFragment target);

    MockWebServer server();
    UserDataRepository userDataRepo(); //these two can be injected because they are directly exposed (still put them in your module as usual. this just directly exposes them so daggermock can use them)
}