gpt4 book ai didi

android - 如何在 androidTest 上正确模拟 ViewModel

转载 作者:IT老高 更新时间:2023-10-28 13:39:45 24 4
gpt4 key购买 nike

我目前正在为 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 不同。

所以我的问题真的是,有人成功地做到了这一点,或者有一些可以帮助我的指针/引用吗?

最佳答案

在您的测试设置中,您需要提供正在被注入(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com