我正在使用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()
的原因。线程休眠的时间越长,失败的可能性就越小,但它并没有解决问题。
关于导致这种奇怪行为的原因以及如何解决这个问题的任何想法?
答案 0 :(得分:1)
我在使用Dagger和Cucumber-jvm的测试中遇到过类似的问题。以下是一些需要注意的问题:
stopSelf()
以防止它在测试运行之间停留。这允许它在重新开始时从新图表中进行注入。