如何测试依赖于匕首子组件的片段?
How to test a fragment that depends on a dagger subcomponent?
注意:我没有使用 Dagger-Android,只是 Dagger 2.
当我开始编写我的应用程序时,我通过 AppComponent 注入片段,所以我的集成测试成功了。
然后我创建了一个名为 MainComponent 的子组件,它位于 MainActivity 中。在我的片段中,我使用
获取子组件
((MainActivity) getActivity()).mainComponent.inject(this);
然后在我的集成测试中我会做
FragmentScenario.launchInContainer(RecipesListFragment.class, null, R.style.AppTheme, null)
这会引发错误
EmptyFragmentActivity cannot be cast to ...MainActivity
作为 FragmentScenario 在 EmptyFragmentActivity 中启动片段。
我认为,为了解决这个问题,我可以删除对 MainActivity 的依赖以获取组件,所以我使用了 FragmentFactory 并将 MainComponent 作为参数传入。但是现在测试失败了,因为当我创建 FragmentScenario 时,我没有 MainComponent 可以在工厂中传递它。
那么有没有办法启动场景并仍然使用 MainComponent 子组件?
贴出我最后为回答 Henrique 的问题所做的工作。我看了一些关于它的帖子,但我现在找不到了,因为它是很久以前的了。
没有明确的答案所以我最终使用对 MainActivity 的依赖来注入,因为使用 FragmentFactory 被证明太麻烦而没有太多收获。
在 AndroidTest 文件夹中,我创建了一个扩展 MainActivity 的空 MainTestActivity。
然后在FragmentTest
ActivityScenario<MainTestActivity> scenario;
@Before
public void setUp() {
scenario = ActivityScenario.launch(MainTestActivity.class).onActivity(activity -> {
MainFragment fragment = new MainFragment();
activity.startActivityFromFragment(fragment, new Intent(activity, MainTestActivity.class), 0);
});
}
注意:我没有使用 Dagger-Android,只是 Dagger 2.
当我开始编写我的应用程序时,我通过 AppComponent 注入片段,所以我的集成测试成功了。
然后我创建了一个名为 MainComponent 的子组件,它位于 MainActivity 中。在我的片段中,我使用
获取子组件((MainActivity) getActivity()).mainComponent.inject(this);
然后在我的集成测试中我会做
FragmentScenario.launchInContainer(RecipesListFragment.class, null, R.style.AppTheme, null)
这会引发错误
EmptyFragmentActivity cannot be cast to ...MainActivity
作为 FragmentScenario 在 EmptyFragmentActivity 中启动片段。
我认为,为了解决这个问题,我可以删除对 MainActivity 的依赖以获取组件,所以我使用了 FragmentFactory 并将 MainComponent 作为参数传入。但是现在测试失败了,因为当我创建 FragmentScenario 时,我没有 MainComponent 可以在工厂中传递它。
那么有没有办法启动场景并仍然使用 MainComponent 子组件?
贴出我最后为回答 Henrique 的问题所做的工作。我看了一些关于它的帖子,但我现在找不到了,因为它是很久以前的了。
没有明确的答案所以我最终使用对 MainActivity 的依赖来注入,因为使用 FragmentFactory 被证明太麻烦而没有太多收获。
在 AndroidTest 文件夹中,我创建了一个扩展 MainActivity 的空 MainTestActivity。
然后在FragmentTest
ActivityScenario<MainTestActivity> scenario;
@Before
public void setUp() {
scenario = ActivityScenario.launch(MainTestActivity.class).onActivity(activity -> {
MainFragment fragment = new MainFragment();
activity.startActivityFromFragment(fragment, new Intent(activity, MainTestActivity.class), 0);
});
}