Android 在活动中插入ViewModelFactory.Provider进行浓缩咖啡测试

Android 在活动中插入ViewModelFactory.Provider进行浓缩咖啡测试,android,dagger-2,Android,Dagger 2,关于这个问题: 在我的测试中,为了让有关Android架构组件的浓缩咖啡测试能够正常工作,我在一个活动中经历了一次又一次的尝试,获得了ViewModelFactory.Provider。我希望它很简单,但我想它不是 让它处理片段的示例很简单: 但是,这根本不适用于活动,因为在使用ActivityTestRule创建活动之前,我无法获取活动的依赖项 我使用Dagger2遵循与上述示例相同的新依赖项注入流,使用HasActivityInjector接口 谢谢你的帮助 可以通过在@Before方法的

关于这个问题:

在我的测试中,为了让有关Android架构组件的浓缩咖啡测试能够正常工作,我在一个活动中经历了一次又一次的尝试,获得了ViewModelFactory.Provider。我希望它很简单,但我想它不是

让它处理片段的示例很简单:

但是,这根本不适用于活动,因为在使用
ActivityTestRule
创建活动之前,我无法获取活动的依赖项
我使用Dagger2遵循与上述示例相同的新依赖项注入流,使用
HasActivityInjector
接口


谢谢你的帮助

可以通过在@Before方法的TestApp中注册自定义ActivityLifecycleCallbacks来设置注入的活动属性

例如:

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


    TestApp testApp = ((TestApp) InstrumentationRegistry.getContext().getApplicationContext());
    testApp.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            //will be called before the onCreate method of your activity
            activity.setViewModelFactory(ViewModelUtil.createFor(viewModel));
        }

        @Override
        public void onActivityStarted(Activity activity) {

        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {

        }

        @Override
        public void onActivityStopped(Activity activity) {

        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

        }

        @Override
        public void onActivityDestroyed(Activity activity) {

        }
    });


    fragment.viewModelFactory = ViewModelUtil.createFor(viewModel);
    fragment.navigationController = navigationController;
    fragment.dataBindingComponent = () -> fragmentBindingAdapters;

    activityRule.getActivity().setFragment(fragment);


}
.setViewModelFactory()
不是一种方法
 @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);


    TestApp testApp = ((TestApp) InstrumentationRegistry.getContext().getApplicationContext());
    testApp.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            //will be called before the onCreate method of your activity
            activity.setViewModelFactory(ViewModelUtil.createFor(viewModel));
        }

        @Override
        public void onActivityStarted(Activity activity) {

        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {

        }

        @Override
        public void onActivityStopped(Activity activity) {

        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

        }

        @Override
        public void onActivityDestroyed(Activity activity) {

        }
    });


    fragment.viewModelFactory = ViewModelUtil.createFor(viewModel);
    fragment.navigationController = navigationController;
    fragment.dataBindingComponent = () -> fragmentBindingAdapters;

    activityRule.getActivity().setFragment(fragment);


}