Joa*_*Ley 10 android mockito kotlin android-espresso android-architecture-components
我目前正在写一些UI单元测试片段,其中之一@Test是看是否显示正确的对象列表,这是不是一个集成测试,所以我想嘲笑的ViewModel.
片段的变量:
class FavoritesFragment : Fragment() {
private lateinit var adapter: FavoritesAdapter
private lateinit var viewModel: FavoritesViewModel
@Inject lateinit var viewModelFactory: FavoritesViewModelFactory
(...)
Run Code Online (Sandbox Code Playgroud)
这是代码:
@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))
(...)
}
Run Code Online (Sandbox Code Playgroud)
我能够嘲笑ViewModel但当然,这ViewModel里面的内容并不相同Fragment.
所以我的问题是,有人成功完成了这项工作,或者有一些指针/参考资料可以帮助我吗?
此外,我试过调查谷歌样本,但没有运气.
作为参考,该项目可以在这里找到: https ://github.com/JoaquimLey/transport-eta/
小智 9
在您的测试设置中,您需要提供一个被注入到 Fragment 中的 FavoritesViewModelFactory 的测试版本。
您可以执行以下操作,其中需要将模块添加到您的 TestAppComponent:
@Module
object TestFavoritesViewModelModule {
val viewModelFactory: FavoritesViewModelFactory = mock()
@JvmStatic
@Provides
fun provideFavoritesViewModelFactory(): FavoritesViewModelFactory {
return viewModelFactory
}
}
Run Code Online (Sandbox Code Playgroud)
然后您就可以在测试中提供您的 Mock viewModel。
fun setupViewModelFactory() {
whenever(TestFavoritesViewModelModule.viewModelFactory.create(FavoritesViewModel::class.java)).thenReturn(viewModel)
}
Run Code Online (Sandbox Code Playgroud)
小智 6
我已经使用 Dagger 注入的额外对象解决了这个问题,你可以在这里找到完整的例子:https : //github.com/fabioCollini/ArchitectureComponentsDemo
在我没有直接使用 ViewModelFactory 的片段中,我定义了一个自定义工厂,定义为 Dagger 单例:https : //github.com/fabioCollini/ArchitectureComponentsDemo/blob/master/uisearch/src/main/java/it/codingjam /github/ui/search/SearchFragment.kt
然后在测试中,我使用DaggerMock替换这个自定义工厂,使用一个总是返回模拟而不是真实 viewModel 的工厂:https : //github.com/fabioCollini/ArchitectureComponentsDemo/blob/master/uisearchTest/src/androidTest/java/it /codingjam/github/ui/repo/SearchFragmentTest.kt
在您提供的示例中,您使用 mockito 为视图模型的特定实例返回模拟,而不是为每个实例返回模拟。
为了使这项工作正常进行,您必须让您的片段使用您创建的确切视图模型模拟。
这很可能来自商店或存储库,所以你可以把你的模拟放在那里?这实际上取决于您如何在片段逻辑中设置视图模型的获取。
建议:1)模拟构建视图模型的数据源或2)添加fragment.setViewModel()并将其标记为仅用于测试。这有点难看,但如果您不想模拟数据源,这种方式非常简单。
| 归档时间: |
|
| 查看次数: |
6629 次 |
| 最近记录: |