我目前正在使用 Kotlin 构建 jetpack 撰写应用程序,但在测试应用程序的导航时遇到困难。
我想模拟我的 ViewModel,这样我的测试就不依赖于 api 等。我尝试了不同的方法来模拟视图模型,但没有一个起作用。我发现要走的路是嘲笑工厂,但我不知道该怎么做。
对于虚拟机的初始化,我有以下工厂:
object AppViewModelProvider {
val Factory = viewModelFactory {
initializer {
FavoriteViewModel(fieldFavoritesApplication().container.favoriteRepository)
}
//More initializers...
}
}
fun CreationExtras.fieldFavoritesApplication(): FieldFavoritesApplication =
(this[AndroidViewModelFactory.APPLICATION_KEY] as FieldFavoritesApplication)
这是导航主机的函数签名:
fun FieldFavoritesNavHost(
navController: NavHostController,
modifier: Modifier = Modifier,
favoriteViewModel: FavoriteViewModel = viewModel(factory = AppViewModelProvider.Factory)
)
最后是测试本身:
class NavigationTest {
@get:Rule
val composeTestRule = createComposeRule()
lateinit var navController:TestNavHostController
@Before
fun setupAppNavHost() {
composeTestRule.setContent {
navController = TestNavHostController(LocalContext.current)
navController.navigatorProvider.addNavigator(ComposeNavigator())
FieldFavoritesApp(navController)
}
}
@Test
fun verifyStartDestination() {
Assert.assertEquals(LeaguesDestination.route, navController.currentBackStackEntry?.destination?.route)
}
}
我如何模拟工厂,以便我可以在此测试中使用假视图模型?
要在结构类似于
Inventory app的项目中模拟
ViewModel
,您可以在 ViewModel
源集中创建具有相同文件名和位置的 androidTest
文件。例如,如果您的应用程序中的 FavoriteViewModel
包中有 ui.favorites
,请在 ui.favorites
中创建 androidTest
包并将模拟 FavoriteViewModel
实现放在那里,它将代替原始包使用。
或者,您可以以类似的方式保留原始
ViewModel
但模拟存储库。例如,如果您想在 Inventory app中模拟
ItemsRepository
,请创建 TestItemsRepository
,在 ItemsRepository
中实现 androidTest
。然后在 AppContainer
包中创建 data
,它将提供您的测试实现:
override val itemsRepository: ItemsRepository by lazy {
TestItemsRepository()
}