相关疑难解决方法(0)

在 MVVM 活动中模拟 ViewModel

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

7
推荐指数
0
解决办法
3838
查看次数

在 Activity 中注入 ViewModelFactory.Provider 以进行 espresso 测试

与此问题相关:Espresso, Dagger2 set ViemodelProvider.Factory on BaseActivity

在测试期间,我历经千辛万苦才在 Activity 上获取 ViewModelFactory.Provider,以便让 espresso 测试能够针对 Android 架构组件进行工作。我以为事情会很简单,但我想事实并非如此......

让它使用片段的示例很简单:
https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/androidTest/java/com/android/example/github/ui /用户/UserFragmentTest.java

@Before
public void init() {
    UserFragment fragment = UserFragment.create("foo");
    viewModel = mock(UserViewModel.class);
    when(viewModel.getUser()).thenReturn(userData);
    when(viewModel.getRepositories()).thenReturn(repoListData);
    navigationController = mock(NavigationController.class);
    fragmentBindingAdapters = mock(FragmentBindingAdapters.class);

    fragment.viewModelFactory = ViewModelUtil.createFor(viewModel);
    fragment.navigationController = navigationController;
    fragment.dataBindingComponent = () -> fragmentBindingAdapters;

    activityRule.getActivity().setFragment(fragment);
}
Run Code Online (Sandbox Code Playgroud)

但是,这根本不适用于活动,因为我无法在使用ActivityTestRule.
我使用 Dagger2 遵循与上面示例中使用接口相同的新依赖项注入流程HasActivityInjector

我将感谢您的帮助!

android dagger-2

5
推荐指数
1
解决办法
1081
查看次数