【发布时间】:2018-11-01 21:28:19
【问题描述】:
您好,我在我的应用程序中使用 dagger 对网络模块、ApplicationModule、DatabaseModule、Presenter 和交互器进行依赖注入。 我想在单元测试期间使用这些相同的类和模块。
作为单元测试参考,我使用以下代码创建了 AndroidTestAppComponent:
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
AndroidTestAppModule.class,
NetworkModule.class
})
public interface AndroidTestAppComponent extends AndroidInjector<AndroidTestApplication> {
@Component.Builder
abstract class AndroidTestAppComponentBuilder extends Builder<AndroidTestApplication> {
}
}
给出所有模块超出了这个问题的范围,考虑AndroidTestAppModule.java below:
public class AndroidTestAppModule {
@Provides
@Singleton
Context provideContext(AndroidTestApplication application) {
return application.getApplicationContext();
}
@Singleton
@Provides
KeyguardManager provideKeyguardManager(Context context) {
return (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
}
@Singleton
@Provides
FingerprintManagerCompat providerFingerPrintManager(Context context) {
return FingerprintManagerCompat.from(context);
}
}
我能够生成DaggerAndroidTestAppComponent。
我的应用程序类如下:
public class AndroidTestApplication extends DaggerApplication implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
AndroidInjector<AndroidTestApplication> androidInjector;
@Override
public void onCreate() {
super.onCreate();
androidInjector.inject(this);
}
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
androidInjector = DaggerAndroidTestAppComponent.builder().create(this);
return androidInjector;
}
@Override
public DispatchingAndroidInjector<Activity> activityInjector() {
return dispatchingActivityInjector;
}
}
其他一些AppPref.java 类
@Singleton
public class AppPref {
private SharedPreferences preferences;
@Inject
AppPref(Context context) {
preferences = context.getSharedPreferences("somefile", Activity.MODE_PRIVATE);
}
}
从文档中读取:AndroidInjection#inject(T t) t 这里采用核心 android 模块,所以当我在我的 Activity AndroidInjection.inject(activity_reference_usually__this__) 中调用它时它可以工作(正常场景,真实构建并且没有测试应用程序)
在不更改太多代码的情况下,我如何在 AndroidInstrumentationTest 中使用这些类,因为我只会更改测试包内 Test**DaggerModules 中的测试实现。
仪器的示例代码如下:
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
AndroidTestApplication application;
@Inject
AppPref appPref;
@Before
public void setUp() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
Context appContext = InstrumentationRegistry.getTargetContext();
application = (AndroidTestApplication) Instrumentation.newApplication(AndroidTestApplication.class, appContext);
DaggerAndroidTestAppComponent.builder().create(application).inject(application);
}
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.a.b", appContext.getPackageName());
}
@Test
public void testPreNotNUll() {
Assert.assertNotNull(appPref);
}
}
理想情况下,apppref 始终为 null,因为在 setUp 方法中我注入了 AndroidTestApplication 类,而不是在 ExampleInstrumentedTest 中,我如何编辑我的 dagger2 代码以便 @Inject 正常工作并且我得到有效的 appPref 对象。
谢谢。
【问题讨论】:
标签: android dagger-2 android-instrumentation dagger