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



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

它是一个单一的组件(尝试过子组件,但 daggerMock 对它不满意): 应用组件.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 界面中处理它。

所以这是我使用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 中的所有模块,所以我认为我有可用的所有依赖项。 我将 null 传递给 AppModule 作为其预期的上下文,我认为这没什么大不了的。

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

如何让dagger2为我建造一个真实的物体?

这里的诀窍是,你想要注入的任何内容都必须直接在组件中公开。 例如,您的组件如下所示:

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

相关内容

  • 没有找到相关文章

最新更新