我正在使用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为我建造一个真实的物体?
答案 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)
}