所以我想测试我的jetpack compose项目。在 [ these instructions 之后运行仪器测试很容易。 ] 1在 android 开发网站上,但是当你添加 @HiltViewModel
注入(inject)组合的事情变得复杂。
我正在尝试使用具有 @Inject 构造函数的 ViewModel 测试一个非常简单的撰写屏幕。
屏幕本身如下所示:
@Composable
fun LandingScreen() {
val loginViewModel: LoginViewModel = viewModel()
MyTheme {
Surface(color = MaterialTheme.colors.background) {
val user by loginViewModel.user.observeAsState()
if (user != null) {
MainScreen()
} else {
LoginScreen(loginViewModel)
}
}
}
}
这是 View 模型:@HiltViewModel
class LoginViewModel @Inject constructor(private val userService: UserService) : ViewModel() {
val user = userService.loggedInUser.asLiveData()
}
用户服务当然由房间数据库支持,loggedInUser 属性返回 Flow
。 .事情在标准运行中按预期工作,但是当尝试在仪器测试中运行它时,它无法注入(inject) View 模型。
@HiltAndroidTest
class LandingScreenTest {
@get:Rule
var hiltRule = HiltAndroidRule(this)
@get:Rule
val composeTestRule = createComposeRule()
@Inject
lateinit var loginViewModel: LoginViewModel
@Before
fun init() {
hiltRule.inject()
}
@Test
fun MyTest() {
composeTestRule.setContent {
MyTheme {
LandingScreen()
}
}
composeTestRule.onNodeWithText("Welcome").assertIsDisplayed()
}
}
Injection of an @HiltViewModel class is prohibited since it does not create a ViewModel instance correctly. Access the ViewModel via the Android APIs (e.g. ViewModelProvider) instead. Injected ViewModel: com.example.viewmodels.LoginViewModel
您如何使用 ViewModelProvider 而不是 @HiltViewModel 来实现这一点?
最佳答案
尝试做这样的事情:
@HiltAndroidTest
class LandingScreenTest {
@get:Rule
var hiltRule = HiltAndroidRule(this)
@get:Rule
val composeTestRule = createComposeRule()
// Remove this line @Inject
lateinit var loginViewModel: LoginViewModel
@Before
fun init() {
hiltRule.inject()
}
@Test
fun MyTest() {
composeTestRule.setContent {
loginViewModel= hiltViewModel() // Add this line
MyTheme {
LandingScreen()
}
}
composeTestRule.onNodeWithText("Welcome").assertIsDisplayed()
}
}
关于android - 使用 @HiltViewModel 进行 Jetpack Compose 仪器测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68826881/