【发布时间】:2015-05-29 08:40:17
【问题描述】:
我在我的安卓应用中使用 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 进行单元测试的更好方法吗?
【问题讨论】:
-
作为初始评论,模块覆盖不是 dagger 2 中的东西。该方法存在以便在人们迁移时不会破坏编译,但已弃用并且对 dagger 2 项目没有影响.
标签: android unit-testing junit dagger-2