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
}
});
}
該功能在設備上手動測試時有效。 如果不清楚,請告訴我。