在 Activity 中注入 ViewModelFactory.Provider 以进行 espresso 测试

Tra*_*ace 5 android dagger-2

与此问题相关:Espresso, Dagger2 set ViemodelProvider.Factory on BaseActivity

在测试期间,我历经千辛万苦才在 Activity 上获取 ViewModelFactory.Provider,以便让 espresso 测试能够针对 Android 架构组件进行工作。我以为事情会很简单,但我想事实并非如此......

让它使用片段的示例很简单:
https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/androidTest/java/com/android/example/github/ui /用户/UserFragmentTest.java

@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}\n
Run Code Online (Sandbox Code Playgroud)\n