我有一个抽象的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
。
当一个活动有一个fragment时,我可以做类似以下的事情:
@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);
因为onCreate
方法会立即被调用,所以没有办法动态地设置viewModelFactory
。 在onCreate
方法被调用之前获取Activity对象的方法似乎也不存在。
如何解决这个问题?
注意:我使用Dagger 2.11 with AndroidInjector。
另请参阅我昨天发布的这个问题的后续信息:Inject ViewModelFactory.Provider in activity for espresso testing
DispatchingAndroidInjector<Activity> activityInjector()
... - Daniel Wilson