是否可以通过dagger将不同的对象注入android.app.IntentService,具体取决于它是测试还是生产?
这主要是将WebRequest类注入服务的代码(简化)。
public class SomeService extends android.app.IntentService {
@Inject
WebReqeust mWebRequest;
public SomeService(String name) {
super(name);
MainApplication.getInstance().inject(this);
}
@Override
protected void onHandleIntent(Intent intent) {
String json = mWebRequest.getHttpString(url);
JSONObject o = new JSONObject(json);
DBHelper.insert(o);
}
}
@Module(injects = { SomeService.class })
public class WebRequestModule {
@Provides
WebRequest provideWebRequest() {
return new WebRequest();
}
}
public class Modules {
public static Object[] list() {
return new Object[] {
new WebRequestModule()
};
}
}
public class MainApplication extends Application {
private ObjectGraph mOjectGraph;
private static MainApplication sInstance;
@Override
public void onCreate() {
sInstance = this;
mOjectGraph = ObjectGraph.create(Modules.list());
}
public void inject(Object dependent) {
mOjectGraph.inject(dependent);
}
public void addToGraph(Object module) {
mOjectGraph.plus(module);
}
}
我想编写一个模拟http响应的测试。 我已经开始使用新模块了
@Module(
injects = SomeService.class,
overrides = true
)
final class MockTestModule {
@Provides
WebRequest provideWebRequest() {
WebRequest webRequest = mock(WebRequest.class);
when(webRequest.getJSONObjectResponse(contains("/register/"))).thenReturn(
new JSONObject(FileHelper.loadJSONFromAssets(this.getClass(),
"mock_register.json")));
when(webRequest.getJSONObjectResponse(contains("/register_validate/"))).thenReturn(
new JSONObject(FileHelper.loadJSONFromAssets(this.getClass(),
"mock_register_validate.json")));
return webRequest;
}
}
在测试中我尝试了以下
public class RegisterTest extends AndroidTestCase {
protected void setUp() throws Exception {
MainApplication.getInstance().addToGraph(new MockTestModule());
super.setUp();
}
public void test_theActuallTest() {
Registration.registerUser("email@email.com"); // this will start the service
wait_hack(); // This makes the test wait for the reposen form the intentservice, works fine
DBHelper.isUserRegisterd("email@email.com"));
}
}
测试成功执行(记住,代码很简单,可能无法编译,只是代表了这个想法)。 但是,它仍然使用" real" WebRequest Impl。,而不是Mocked。我在日志,代理和服务器上看到它......
我用RoboGuice以非常类似的方式完成了这项工作。 但不知怎的,我无法用匕首完成这件事。 (我目前正在评估DI框架,这是一个"必须有")
答案 0 :(得分:0)
plus
方法实际返回新图表。它不会覆盖原始图表。据说可以完成你想要的任务。
public class MainApplication extends Application {
...
// Mostly used for testing
public void addToGraph(Object module) {
mObjectGraph = mOjectGraph.plus(module);
}
}
这将获取原始图形并将其与新模块一起使用,然后将新图形分配给mObjectGraph参考。