Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dagger 2.11-在验收测试中注入不同的networkAPI实现_Java_Android_Unit Testing_Dagger 2 - Fatal编程技术网

Java Dagger 2.11-在验收测试中注入不同的networkAPI实现

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的模块列表中

我有一个简单的应用程序。它使用网络API(截取)。它使用Dagger2.11(使用AndroidJector)进行依赖项反转。NetworkAPI被注入到MainActivity中。对于验收测试,我使用自己的TestRunner,它是从AndroidJUnitRunner扩展而来的

为了伪造真实的网络API,我使用了一个ImmediateResponseNetwork对象。这一“网络”立即作出反应。该实例由TestNetworkApimule提供,并在TestAppComponent的模块列表中声明。请参阅下面的部分源代码

当时,在使用Dagger之前,我使用ImmediateResponseNetwork定义networkRequest的不同响应,这取决于测试。现在似乎不可能,因为网络隐藏在测试活动中。在网络建立之后,我无法从外部访问它来准备它

我也无法测试较慢的网络连接。这就是为什么我希望至少注入另一个伪慢响应网络对象,并且我希望能够通过即时响应网络准备响应。 我该怎么做

我想写的一个示例测试是: 正在测试,网络请求运行时是否显示加载指示器

我现在不知道该如何实施。看起来,DI阻碍了更容易的测试,而不是相反。 我想,我的思想中缺少了一些东西

问题所基于的源代码:

样本测试,我想做:

@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;
    ...

    }