我有一个像这样的抽象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);
}
}
Run Code Online (Sandbox Code Playgroud)
测试期间的问题是我没有办法设置viewModelFactory活动.
当一个活动有片段时,我可以做类似的事情:
@Before
public …Run Code Online (Sandbox Code Playgroud) 29/04/18 更新
重新命名以提高准确性。问题很简单:ViewModels不能简单地在 Activity 上模拟,因为它们是在 Acitivity 的 onCreate() 中实例化的。解决这个问题的最佳方法是什么?
一些相关的想法位于here(未成功尝试实施)
原始问题
使用 Google 的 MVVM GithubBrowserSample 代码库,我正在尝试进行仪器测试以检查加载状态是否会弹出进度条。具体来说,是UserFragmentTest.loading() 方法的镜像。这是非常简单的事情,我试图将我的设置与 Google 的设置紧密匹配。
但是我可以看到这是不对的。具体来说,当我明确要求它们不在我的测试@Before函数中时,我可以看到正在调用我的 ViewModel (VM) 中的函数。我正在使用 Kotlin、Dagger2 和架构组件。
当我运行UserFragmentTest.loading()测试时,我可以看到代码确实在 VM 中没有调用任何东西(甚至没有调用构造函数)。然而BaseActivity,即使我要求它返回虚拟数据,我的也会调用 VM init 块(设置)和 getUser() 函数。我能看到的唯一主要区别是我的 Activity 和 Google 正在测试 Fragment,而 ViewModel 模拟函数使用 Niek Haarman 的Mockito-Kotlin库。
登录活动测试.kt
@RunWith(AndroidJUnit4::class)
class LoginActivityTest {
private val email = "***********@gmail.com"
private val password = "123456"
@Suppress("MemberVisibilityCanBePrivate")
@get:Rule
val activityRule = ActivityTestRule(LoginActivity::class.java) …Run Code Online (Sandbox Code Playgroud) mockito kotlin android-espresso android-mvvm android-architecture-components
android ×1
android-architecture-components ×1
android-mvvm ×1
dagger-2 ×1
kotlin ×1
mockito ×1