2017-09-23 42 views
0

我有一個與我的儀器測試有關的惱人的困境。Android儀器測試片段:將僞造的活動投射到特定的LoginActivity

下測試的代碼在LoginFragment:

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    loginActivity = (LoginActivity) getActivity(); 
    accountViewModel = ViewModelProviders.of(this, viewModelFactory).get(AccountViewModel.class); 
    accountViewModel.getAuthenticatedUserResource().observe(this, authenticatedUserResource -> { 
     binding.get().setAuthenticatedUserResource(authenticatedUserResource); 
     binding.get().executePendingBindings(); 

     if(authenticatedUserResource.status == Status.SUCCESS) { 
      loginActivity 
        .redirectToHome(); 
     } 
    }); 
} 

我的測試指定:

@RunWith(AndroidJUnit4.class) 
public class LoginFragmentTest { 
    private static final String fbId = "xxxxxx"; 
    private static final String fbUsername = "xxxxxx"; 
    private static final String genderShort = "m"; 
    private static final String lfId = "xxxxxxxxxx"; 
    private static final String jwt = "xxxxxxxxx"; 
    private static final String refreshToken = "xxxxxxxx"; 

    @Rule 
    public ActivityTestRule<LoginFragmentActivity> activityRule = 
      new ActivityTestRule<>(LoginFragmentActivity.class, true, true); <-- LoginFragmentActivity is a fake replacement for LoginActivity 

    private AccountViewModel viewModel; 
    private MutableLiveData<Resource<AuthenticatedUser>> authenticatedUser = new MutableLiveData<>(); 

    @Before 
    public void init() { 
     LoginFragment fragment = LoginFragment.newInstance(); 
     viewModel = mock(AccountViewModel.class); 
     when(viewModel.getAuthenticatedUserResource()).thenReturn(authenticatedUser); 

     fragment.viewModelFactory = ViewModelUtil.createFor(viewModel); 
     activityRule.getActivity().setFragment(fragment); <-- set the fragment under test 
    } 

    @Test 
    public void loginSuccess() { 
     User user = new User(lfId, fbId, fbUsername, genderShort); 
     AuthenticatedUser authUser = new AuthenticatedUser(user, jwt, refreshToken); 
     authenticatedUser.postValue(Resource.success(authUser)); 
     intended(toPackage("com.example.kimgysen.livefeed_v002.ui.home.HomeActivity")); 
    } 

我使用LoginFragmentActivity作爲假替代(即LoginActivity)的實際活性。
測試從例如採取提供:https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/androidTest/java/com/android/example/github/ui/user/UserFragmentTest.java

的問題是在我的實際活動,我儘量讓鑄造(以前的代碼的重複使用就行的指示),因爲我使用它失敗假登錄片段活動:

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    loginActivity = (LoginActivity) getActivity(); // <--- This line 
    accountViewModel = ViewModelProviders.of(this, viewModelFactory).get(AccountViewModel.class); 
    accountViewModel.getAuthenticatedUserResource().observe(this, authenticatedUserResource -> { 
     binding.get().setAuthenticatedUserResource(authenticatedUserResource); 
     binding.get().executePendingBindings(); 

     if(authenticatedUserResource.status == Status.SUCCESS) { 
      loginActivity 
        .redirectToHome(); <-- In order to execute this line 
     } 
    }); 
} 

該功能在設備上手動測試時有效。 如果不清楚,請告訴我。

回答

0

這個特殊的問題可以通過開始從片段的意圖是固定的:

Intent intent = new Intent(getActivity(), HomeActivity.class); 
startActivity(intent); 

雖然這個固定我的具體問題,就如何使中投的問題目前仍然沒有答案。

相關問題