如何在 androidTest 上正确模拟 ViewModel

新手上路,请多包涵

我目前正在为一个片段编写一些 UI 单元测试,其中一个 @Test 是查看对象列表是否正确显示,这 不是集成 测试,因此我想 模拟 ViewModel

片段的变量:

 class FavoritesFragment : Fragment() {

    private lateinit var adapter: FavoritesAdapter
    private lateinit var viewModel: FavoritesViewModel
    @Inject lateinit var viewModelFactory: FavoritesViewModelFactory

    (...)

这是代码:

 @MediumTest
@RunWith(AndroidJUnit4::class)
class FavoritesFragmentTest {

    @Rule @JvmField val activityRule = ActivityTestRule(TestFragmentActivity::class.java, true, true)
    @Rule @JvmField val instantTaskExecutorRule = InstantTaskExecutorRule()

    private val results = MutableLiveData<Resource<List<FavoriteView>>>()
    private val viewModel = mock(FavoritesViewModel::class.java)

    private lateinit var favoritesFragment: FavoritesFragment

    @Before
    fun setup() {
        favoritesFragment = FavoritesFragment.newInstance()
        activityRule.activity.addFragment(favoritesFragment)
        `when`(viewModel.getFavourites()).thenReturn(results)
    }

    (...)

    // This is the initial part of the test where I intend to push to the view
    @Test
    fun whenDataComesInItIsCorrectlyDisplayedOnTheList() {
        val resultsList = TestFactoryFavoriteView.generateFavoriteViewList()
        results.postValue(Resource.success(resultsList))

        (...)
    }

我能够模拟 ViewModel 但当然,这不一样 ViewModelFragment 中创建。

所以我的问题真的是,有人成功地做到了这一点,或者有一些可能对我有帮助的指示/参考资料吗?

  • 另外,我试过查看 google-samples 但没有运气。

  • 作为参考,该项目可以在这里找到: https ://github.com/JoaquimLey/transport-eta/

原文由 Joaquim Ley 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 509
2 个回答

在您提供的示例中,您正在使用 mockito 为视图模型的特定实例返回模拟,而不是为每个实例返回模拟。

为了完成这项工作,您必须让您的片段使用您创建的确切视图模型模拟。

这很可能来自商店或存储库,因此您可以将模拟放在那里?这实际上取决于您如何在片段逻辑中设置视图模型的获取。

建议:1) 模拟构建视图模型的数据源或 2) 添加一个 fragment.setViewModel() 并将其标记为仅用于测试。这有点难看,但如果你不想模拟数据源,这种方式很容易。

原文由 Sam Edwards 发布,翻译遵循 CC BY-SA 3.0 许可协议

在您的测试设置中,您需要提供 FavoritesViewModelFactory 的测试版本,它被注入到 Fragment 中。

您可以执行类似以下操作,其中需要将模块添加到您的 TestAppComponent:

 @Module
object TestFavoritesViewModelModule {

    val viewModelFactory: FavoritesViewModelFactory = mock()

    @JvmStatic
    @Provides
    fun provideFavoritesViewModelFactory(): FavoritesViewModelFactory {
        return viewModelFactory
    }
}

然后您就可以在测试中提供您的 Mock viewModel。

 fun setupViewModelFactory() {
    whenever(TestFavoritesViewModelModule.viewModelFactory.create(FavoritesViewModel::class.java)).thenReturn(viewModel)
}

原文由 Chris 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题