我目前正在为一个片段编写一些 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
但当然,这不一样 ViewModel
在 Fragment
中创建。
所以我的问题真的是,有人成功地做到了这一点,或者有一些可能对我有帮助的指示/参考资料吗?
另外,我试过查看 google-samples 但没有运气。
作为参考,该项目可以在这里找到: https ://github.com/JoaquimLey/transport-eta/
原文由 Joaquim Ley 发布,翻译遵循 CC BY-SA 4.0 许可协议
在您提供的示例中,您正在使用 mockito 为视图模型的特定实例返回模拟,而不是为每个实例返回模拟。
为了完成这项工作,您必须让您的片段使用您创建的确切视图模型模拟。
这很可能来自商店或存储库,因此您可以将模拟放在那里?这实际上取决于您如何在片段逻辑中设置视图模型的获取。
建议:1) 模拟构建视图模型的数据源或 2) 添加一个 fragment.setViewModel() 并将其标记为仅用于测试。这有点难看,但如果你不想模拟数据源,这种方式很容易。