与此问题相关:Espresso, Dagger2 set ViemodelProvider.Factory on BaseActivity
在测试期间,我历经千辛万苦才在 Activity 上获取 ViewModelFactory.Provider,以便让 espresso 测试能够针对 Android 架构组件进行工作。我以为事情会很简单,但我想事实并非如此......
@Before
public void init() {
UserFragment fragment = UserFragment.create("foo");
viewModel = mock(UserViewModel.class);
when(viewModel.getUser()).thenReturn(userData);
when(viewModel.getRepositories()).thenReturn(repoListData);
navigationController = mock(NavigationController.class);
fragmentBindingAdapters = mock(FragmentBindingAdapters.class);
fragment.viewModelFactory = ViewModelUtil.createFor(viewModel);
fragment.navigationController = navigationController;
fragment.dataBindingComponent = () -> fragmentBindingAdapters;
activityRule.getActivity().setFragment(fragment);
}
Run Code Online (Sandbox Code Playgroud)
但是,这根本不适用于活动,因为我无法在使用ActivityTestRule.
我使用 Dagger2 遵循与上面示例中使用接口相同的新依赖项注入流程HasActivityInjector。
我将感谢您的帮助!
小智 -1
可以通过在 @Before 方法中在 TestApp 中注册自定义 ActivityLifecycleCallbacks 来设置注入的活动属性。
\n\n例子:
\n\n @Before\npublic void init(){\n\n\n UserFragment fragment = UserFragment.create("foo");\n viewModel = mock(UserViewModel.class);\n when(viewModel.getUser()).thenReturn(userData);\n when(viewModel.getRepositories()).thenReturn(repoListData);\n navigationController = mock(NavigationController.class);\n\n\n TestApp testApp = ((TestApp) InstrumentationRegistry.getContext().getApplicationContext());\n testApp.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {\n @Override\n public void onActivityCreated(Activity activity, Bundle savedInstanceState) {\n //will be called before the onCreate method of your activity\n activity.setViewModelFactory(ViewModelUtil.createFor(viewModel));\n }\n\n @Override\n public void onActivityStarted(Activity activity) {\n\n }\n\n @Override\n public void onActivityResumed(Activity activity) {\n\n }\n\n @Override\n public void onActivityPaused(Activity activity) {\n\n }\n\n @Override\n public void onActivityStopped(Activity activity) {\n\n }\n\n @Override\n public void onActivitySaveInstanceState(Activity activity, Bundle outState) {\n\n }\n\n @Override\n public void onActivityDestroyed(Activity activity) {\n\n }\n });\n\n\n fragment.viewModelFactory = ViewModelUtil.createFor(viewModel);\n fragment.navigationController = navigationController;\n fragment.dataBindingComponent = () -> fragmentBindingAdapters;\n\n activityRule.getActivity().setFragment(fragment);\n\n\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1081 次 |
| 最近记录: |