android - 使用 @HiltViewModel 进行 Jetpack Compose 仪器测试

标签 android kotlin android-jetpack-compose dagger-hilt

所以我想测试我的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/

相关文章:

Android Jetpack compose - 观察第二次更改后未触发的实时数据

android - 在 Android 中使用 Glide 和 Kotlin 在 ScrollView/RecyclerView 中显示 n 个图像

android - Jetpack 撰写 : LazyColumn not updating with MutableList

android - 通过 android gallery 裁剪方法裁剪可绘制图像

android - Android Studio无法打开Maven集成对话框

android - 如何将 Android 支持存储库添加到 Android Studio?

android - 忽略 Jetpack Compose Card 上的单击,但在包含的布局中捕获它

javascript - 如何修复谷歌地图上的标记并移动 map ?

java - 将一个函数从 java 转换为 kotlin android

android - 如何更改 Jetpack Compose 中的 AppBar 菜单?