作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我目前正在为 fragment 编写一些 UI 单元测试,其中一个 @Test
是查看对象列表是否正确显示,这不是集成 测试,因此我希望 mock ViewModel
。
fragment 的变量:
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
但当然,这与在 Fragment
中创建的 ViewModel
不同。
所以我的问题真的是,有人成功地做到了这一点,或者有一些可以帮助我的指针/引用吗?
另外,我试过查看 google-samples但没有运气。
作为引用,该项目可以在这里找到: https://github.com/JoaquimLey/transport-eta/
最佳答案
在您的测试设置中,您需要提供正在被注入(inject) Fragment 的 FavoritesViewModelFactory 的测试版本。
您可以执行以下操作,其中需要将模块添加到您的 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)
}
关于android - 如何在 androidTest 上正确模拟 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49833533/
我是一名优秀的程序员,十分优秀!