У меня есть абстрактная AccountRequiredActivity, которая выглядит так (и отлично работает):
public abstract class AccountRequiredActivity extends LifecycleActivity {
@Inject
ViewModelProvider.Factory viewModelFactory;
private AccountViewModel accountViewModel;
public abstract void doOnCreate(Bundle savedInstanceState);
public abstract void doOnResume();
@Override
protected final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loading_app);
AndroidInjection.inject(this);
accountViewModel = ViewModelProviders.of(this, viewModelFactory).get(AccountViewModel.class);
if(!accountViewModel.isAuthenticated()) {
redirectToLogin();
} else {
doOnCreate(savedInstanceState);
};
}
@Override
protected void onResume() {
super.onResume();
if(!accountViewModel.isAuthenticated()) {
redirectToLogin();
} else {
doOnResume();
};
}
private void redirectToLogin() {
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
}
}
Проблема во время тестов заключается в том, что у меня нет способа установить viewModelFactory
в действие.
Когда у объекта есть фрагмент, я могу просто сделать что-то вроде:
@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);
}
Однако в этом случае проблема заключается в том, что я использую это в своих тестах (HomeActivity расширяет AccountRequiredActivity):
@Rule
public ActivityTestRule<HomeActivity> activityTestRule = new ActivityTestRule<>(HomeActivity.class, true, false);
Таким образом, нет возможности динамически устанавливать viewModelFactory
, так как onCreate
немедленно вызывается. Кажется, что нет способа получить доступ к объекту Activity до вызова onCreate
.
Как решить эту проблему?
Примечание. Я использую Dagger 2.11 с AndroidInjector.
Также см. Этот вопрос, который я опубликовал вчера для последующей информации:
Inject ViewModelFactory.Provider в действии для тестирования эспрессо