Android 在测试中重写调试模块
我有一个Gradle应用程序,其项目结构类似于: 在我的应用程序类中,我构建了匕首图并将其注入:Android 在测试中重写调试模块,android,dagger,Android,Dagger,我有一个Gradle应用程序,其项目结构类似于: 在我的应用程序类中,我构建了匕首图并将其注入: MyApplication extends Application { ... public void buildObjectGraphAndInject() { Object[] modules = Modules.list(this); mApplicationGraph = ObjectGraph.create(modules);
MyApplication extends Application {
...
public void buildObjectGraphAndInject() {
Object[] modules = Modules.list(this);
mApplicationGraph = ObjectGraph.create(modules);
mApplicationGraph.inject(this);
}
...
}
在调试源集中,我将Modules.list()
定义为:
public final class Modules {
public static Object[] list(MyApplication app) {
return new Object[] {
new AppModule(app),
new DebugAppModule()
};
}
private Modules() {
// No instances.
}
}
在release sourceset中,我定义了与DebugAppModule不同的东西:
public final class Modules {
public static Object[] list(MyApplication app) {
return new Object[] {
new AppModule(app)
};
}
private Modules() {
// No instances.
}
}
在依赖关系图的更深处,我创建了一个MockRestAdapter,可以在运行调试版本时使用:
@Module(
complete = false,
library = true,
overrides = true
)
public final class DebugApiModule {
@Provides @Singleton Endpoint provideEndpoint(@ApiEndpoint StringPreference apiEndpoint) {
return Endpoints.newFixedEndpoint(apiEndpoint.get());
}
@Provides @Singleton MockRestAdapter provideMockRestAdapter(RestAdapter restAdapter, SharedPreferences preferences) {
MockRestAdapter mockRestAdapter = MockRestAdapter.from(restAdapter);
AndroidMockValuePersistence.install(mockRestAdapter, preferences);
return mockRestAdapter;
}
@Provides @Singleton MyApi provideMyApi(RestAdapter restAdapter, MockRestAdapter mockRestAdapter,
@IsMockMode boolean isMockMode, MockMyApi mockService) {
if (isMockMode) {
return mockRestAdapter.create(MyApi.class, mockService);
}
return restAdapter.create(MyApi.class);
}
}
但是当我运行测试时,我想用一个TestApiModule覆盖DebugApiModule,如下所示:
@Module(
complete = false,
library = true,
overrides = true
)
public final class TestApiModule {
@Provides @Singleton Endpoint provideEndpoint(@ApiEndpoint StringPreference apiEndpoint) {
return Endpoints.newFixedEndpoint(apiEndpoint.get());
}
@Provides @Singleton MockRestAdapter provideMockRestAdapter(RestAdapter restAdapter, SharedPreferences preferences) {
MockRestAdapter mockRestAdapter = MockRestAdapter.from(restAdapter);
mockRestAdapter.setDelay(0);
mockRestAdapter.setErrorPercentage(0);
mockRestAdapter.setVariancePercentage(0);
return mockRestAdapter;
}
@Provides @Singleton MyApi provideMyApi(MockRestAdapter mockRestAdapter, MockHnApi mockService) {
return mockRestAdapter.create(MyApi.class, mockService);
}
}
public final class Modules {
public static Object[] list(MyApplication app) {
return new Object[] {
new AppModule(app),
new TestAppModule()
};
}
private Modules() {
// No instances.
}
}
实现这一目标的最佳方式是什么?我是否需要像这样创建一个TestAppModule
:
@Module(
complete = false,
library = true,
overrides = true
)
public final class TestApiModule {
@Provides @Singleton Endpoint provideEndpoint(@ApiEndpoint StringPreference apiEndpoint) {
return Endpoints.newFixedEndpoint(apiEndpoint.get());
}
@Provides @Singleton MockRestAdapter provideMockRestAdapter(RestAdapter restAdapter, SharedPreferences preferences) {
MockRestAdapter mockRestAdapter = MockRestAdapter.from(restAdapter);
mockRestAdapter.setDelay(0);
mockRestAdapter.setErrorPercentage(0);
mockRestAdapter.setVariancePercentage(0);
return mockRestAdapter;
}
@Provides @Singleton MyApi provideMyApi(MockRestAdapter mockRestAdapter, MockHnApi mockService) {
return mockRestAdapter.create(MyApi.class, mockService);
}
}
public final class Modules {
public static Object[] list(MyApplication app) {
return new Object[] {
new AppModule(app),
new TestAppModule()
};
}
private Modules() {
// No instances.
}
}
并将所有debugfoodules
替换为testfoodules
?如果是这样,我如何避免Modules.java
是重复的这一事实?还是我离基地太远了
编辑:解决方案
最后,我做的是在测试设置期间替换应用程序级图(创建MockRestAdapter的地方)
protected void setUp() throws Exception {
super.setUp();
HnApp app = HnApp.getInstance();
app.buildObjectGraphAndInject(TestModules.list(app));
getActivity();
}
到目前为止,我所做的(我还不完全确定这是否可以扩展)是在测试中创建一个静态测试模块类
@Module(
injects = {
SharedPreferences.class
})
static class TestModule {
@Provides @Singleton SharedPreferences provideSharedPreferences(){
return Mockito.mock(SharedPreferences.class);
}
}
在setup()方法中,我注入了测试模块
@Before
public void setUp(){
ObjectGraph.create(new TestModule()).inject(this);
}
然后我@injected模拟类:
@Inject SharedPreferences sharedPreferences;