[英]Injecting test module with dagger2
我在我的Android应用程序中使用Dagger2。 基本上我在MainActivity
注入一个HttpClient
(接口)。
@Module
public class MainActivityModule{
@Provides public HttpClient providesHttpComponent(){
return new RealHttpClient();
}
}
@Component( modules = MainActivityModule.class )
public interface MainActivityComponent {
public MainActivity injectActivity(MainActivity);
}
public class MainActivity extends Activity {
public void onCreate(Bundle saved){
super.onCreate();
injectDependencies();
}
protected void injectDependencies(){
Dagger_MainActivityComponent
.builder()
.mainActivityComponent( new MainActivityModule())
.build()
.injectActivity(this);
}
}
到目前为止一切顺利,效果如预期。 现在我想为MainActivity
编写一些单元测试(不是android工具测试),我想使用TestMainActivityModule
而不是MainActivityModule
。
@Module (overrides = true )
public class TestMainActivtiyModule extends MainActivityModule {
@Provides public HttpClient(){
return new MockHttpClient();
}
}
我的问题是:如何强制MainActivity
使用TestMainActivitiyModule
而不是MainActivityModule
? 那有一个很好的解决方案吗?
我目前的方法是使用继承并覆盖getModule()
,就像这样
public class TestMainActivity extend MainActivity {
@Override
protected void injectDependencies(){
Dagger_MainActivityComponent
.builder()
.mainActivityComponent( new TestMainActivtiyModule())
.build()
.injectActivity(this);
}
}
并针对TestMainActivity
而不是MainActivity
运行单元测试。
我猜它有效,但我遇到的问题之一就是我无法用Intent
启动TestMainActivity
,因为我无法在AndroidManifest.xml
指定它
有没有人知道在Android上使用dagger2进行单元测试的更好方法?
我开始使用的方法涉及在并行构建变体(例如: app
和integration
)中维护两个模块(一个用于app,一个用于测试)。 仍然不确定该解决方案如何很好地扩展YMMV。 我很高兴看到更好的解决方案!
这也很棒: http : //engineering.circle.com/instrumentation-testing-with-dagger-mockito-and-espresso/
我真的建议你检查这个样板,因为它完全基于使用Dagger2的DI。 它还展示了如何以非常简洁的方式替换测试环境中的依赖项。
锅炉板当前处理的依赖关系如下:
依赖注入的强大功能非常方便,特别是对于测试,因为您可以轻松地将测试环境中的依赖项切换为虚拟依赖项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.