我正在使用 Dagger 将依赖项注入到 Android 项目中的活动中。所有提供者都保存在一个模块中,该模块由Application
子类存储和管理。活动将它们的依赖项注入onCreate()
,从上下文中获取模块。
在测试中,我有时需要将默认模块换成另一个。我正在使用ActivityAndroidTestCase2
. 我在调用之前获取应用程序上下文getActivity()
,然后替换模块,如下所示:
Context applicationContext = getInstrumentation()
.getTargetContext().getApplicationContext();
module.setAppContext(applicationContext);
Thread.sleep(1000); // note this
((ObjectGraphProvider) applicationContext).setModule(module);
MyApplication
代码:
public class MyApp extends Application implements ObjectGraphProvider {
private ObjectGraph objectGraph;
private Object module;
public MyApp() {
super();
ApplicationContextModule myModule = new DefaultModule();
myModule.setAppContext(this);
this.module = myModule;
}
@Override
public void onCreate() {
super.onCreate();
objectGraph = ObjectGraph.create(module);
}
@Override
public ObjectGraph objectGraph() {
return objectGraph;
}
/* Test only */
public void setModule(Object module) {
this.module = module;
objectGraph = ObjectGraph.create(module);
}
}
可悲的是,测试有时会失败——这就是sleep()
第一个代码片段中出现的原因。线程休眠的时间越长,失败的机会就越小,但它并不能永远解决问题。
关于导致这种奇怪行为的原因以及如何解决这个问题的任何想法?