Java Dagger 2.11-在验收测试中注入不同的networkAPI实现
我有一个简单的应用程序。它使用网络API(截取)。它使用Dagger2.11(使用AndroidJector)进行依赖项反转。NetworkAPI被注入到MainActivity中。对于验收测试,我使用自己的TestRunner,它是从AndroidJUnitRunner扩展而来的 为了伪造真实的网络API,我使用了一个ImmediateResponseNetwork对象。这一“网络”立即作出反应。该实例由TestNetworkApimule提供,并在TestAppComponent的模块列表中声明。请参阅下面的部分源代码 当时,在使用Dagger之前,我使用ImmediateResponseNetwork定义networkRequest的不同响应,这取决于测试。现在似乎不可能,因为网络隐藏在测试活动中。在网络建立之后,我无法从外部访问它来准备它 我也无法测试较慢的网络连接。这就是为什么我希望至少注入另一个伪慢响应网络对象,并且我希望能够通过即时响应网络准备响应。 我该怎么做 我想写的一个示例测试是: 正在测试,网络请求运行时是否显示加载指示器 我现在不知道该如何实施。看起来,DI阻碍了更容易的测试,而不是相反。 我想,我的思想中缺少了一些东西 问题所基于的源代码: 样本测试,我想做:Java Dagger 2.11-在验收测试中注入不同的networkAPI实现,java,android,unit-testing,dagger-2,Java,Android,Unit Testing,Dagger 2,我有一个简单的应用程序。它使用网络API(截取)。它使用Dagger2.11(使用AndroidJector)进行依赖项反转。NetworkAPI被注入到MainActivity中。对于验收测试,我使用自己的TestRunner,它是从AndroidJUnitRunner扩展而来的 为了伪造真实的网络API,我使用了一个ImmediateResponseNetwork对象。这一“网络”立即作出反应。该实例由TestNetworkApimule提供,并在TestAppComponent的模块列表中
@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()));
}
看起来你必须用产品的味道来做这样的事情。请参见带有
mock
和prod
flavors@David Rawson的回购协议样本。是的,我知道这种方法,而且行之有效。我希望有一个没有味道的解决方案。我不喜欢在实现时在风格之间切换,运行那些测试很容易被忘记,但也许只针对那些验收测试的风格就可以了。谢谢你的提示。我尝试了许多不同的方法,但它们都很混乱。产品风味最终成为最清洁的解决方案。或者,您可以在应用程序和活动上使用包私有setter。我按照David Rawson的建议,使用flavors方法准备了解决方案。它位于问题中原始问题样本的一个分支中。模拟不同种类的NetworkAPI有三种风格,两种风格。似乎您必须使用产品风格来实现类似的功能。请参见带有mock
和prod
flavors@David Rawson的回购协议样本。是的,我知道这种方法,而且行之有效。我希望有一个没有味道的解决方案。我不喜欢在实现时在风格之间切换,运行那些测试很容易被忘记,但也许只针对那些验收测试的风格就可以了。谢谢你的提示。我尝试了许多不同的方法,但它们都很混乱。产品风味最终成为最清洁的解决方案。或者,您可以在应用程序和活动上使用包私有setter。我按照David Rawson的建议,使用flavors方法准备了解决方案。它位于问题中原始问题样本的一个分支中。模拟不同种类的NetworkAPI有三种风格,两种风格。
@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;
}
}
public class MainActivity extends AppCompatActivity {
private TextView responseView;
private boolean progressBarVisible;
@Inject
NetworkApi networkApi;
...
}