2017-10-02 1 views
2
この質問に関連

Espresso, Dagger2 set ViemodelProvider.Factory on BaseActivityを注入ViewModelFactory.Providerエスプレッソテストのための活動で

私はに関するAndroidの作業エスプレッソテストを取得するためには、私のテスト中に活動のViewModelFactory.Providerを取得するために戻って地獄を経て、アーキテクチャコンポーネント。私はそれが簡単であることを期待、私はそれはそれは断片で作業を取得する例...

ないだと思う簡単です:
https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/androidTest/java/com/android/example/github/ui/user/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); 
} 

しかし、これは単に活動では動作しませんActivityTestRuleを使用して作成前のアクティビティに依存することはできません。
HasActivityInjectorインターフェイスを使用して、上記の例のようにDagger2と同じ新しい依存性注入フローを続けました。

私はあなたの助けに感謝します!

答えて

-1

注入アクティビティ属性を設定するには、カスタムActivityLifecycleCallbacksを@BeforeメソッドのTestAppに登録します。

例:

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


} 
+0

'.setViewModelFactory()'メソッドではありません – davkutalek

関連する問題