我有一个简单的应用程序。它使用网络API(Volley)。它使用Dagger 2.11(使用AndroidInjector)进行依赖性反转。 NetworkAPI是在MainActivity中注入的。对于验收测试,我使用自己的TestRunner,从AndroidJUnitRunner扩展。
为了伪造真正的网络API,我使用了ImmediateResponseNetwork对象。这个“网络”立即响应。该实例由TestNetworkApiModule提供,并在TestAppComponent的模块列表中声明。请参阅下面的部分源代码。
有时,在我使用Dagger之前,我使用ImmediateResponseNetwork来定义networkRequest的不同响应,取决于测试。现在似乎不可能,因为网络隐藏在被测活动中。在创建网络后,我无法从外部访问它以进行准备。
我也无法测试较慢的网络连接。这就是为什么我想至少注入另一个假的慢响应网络对象,我希望能够通过ImmediateResponseNetwork准备响应。 我怎么能这样做?
我想写的一个示例测试是: 测试,当网络请求正在运行时,显示加载指示符。
我现在不知道如何实现这一点。看起来,DI是为了更容易测试,而不是相反。 我想,我的想法中缺少一些东西。
问题所依据的源代码:https://github.com/Minsky/SO_Question_AndroidInjectionInTestsWithDagger
样本测试,我想这样做:
@Rule
public ActivityTestRule<MainActivity> mainActivityTestRule = new ActivityTestRule<>(MainActivity.class, true, false);
public void afterStartLoadingPleaseWaitInfoIsDisplayed() throws Exception {
MainActivityTestRule.launchActivity(new Intent());
onView(withId(R.id.activity_loading_indicator)).check(matches(isDisplayed()));
}
我的相关测试设置类:
@Module
public class TestNetworkApiModule extends NetworkApiModule {
@Provides
static NetworkApi provideNetworkApi(Context context) {
return new ImmediateResponseNetwork();
}
}
@Singleton
@Component(modules = {
AppModule.class,
TestNetworkApiModule.class,
ActivityBindingModule.class,
AndroidSupportInjectionModule.class
})
public interface TestAppComponent extends AppComponent {
void inject(TestMyApplication app);
@Override
void inject(DaggerApplication instance);
@Component.Builder
interface Builder {
@BindsInstance
TestAppComponent.Builder application(Application application);
TestAppComponent build();
}
}
public class TestMyApplication extends DaggerApplication {
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
TestAppComponent appComponent = DaggerTestAppComponent.builder().application(this).build();
appComponent.inject(this);
return appComponent;
}
}
注入networkAPI的活动:
public class MainActivity extends AppCompatActivity {
private TextView responseView;
private boolean progressBarVisible;
@Inject
NetworkApi networkApi;
...
}