android - 在 robolectric 的测试中使用 hiltViewModel() 和 createComposeRule() 会抛出 NoSuchMethodException
问题描述
我运行以下测试:
@RunWith(RobolectricTestRunner::class)
@HiltAndroidTest
class ExampleTest {
@get:Rule
val hiltRule = HiltAndroidRule(this)
@get:Rule
val composeTestRule = createComposeRule()
@Test
fun test() {
composeTestRule.setContent {
hiltViewModel<ExampleViewModel>()
}
}
}
@HiltViewModel
class ExampleViewModel @Inject constructor(context: Context) : ViewModel()
在里面composeTestRule.setContent
我称之为神器hiltViewModel<ExampleViewModel>()
的一部分。androidx.hilt:hilt-navigation-compose:1.0.0-alpha03
不幸的是,这个测试NoSuchMethodException
在初始化 viewModel 时抛出。
Caused by: java.lang.NoSuchMethodException: com.example.ExampleViewModel.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3349)
at java.base/java.lang.Class.newInstance(Class.java:556)
... 115 more
解决方案
要解决这个问题,我们必须使用:
@get:Rule
val composeTestRule = createAndroidComposeRule<HiltActivity>()
代替
@get:Rule
val composeTestRule = createComposeRule()
其中HiltActivity是带有@AndroidEntryPoint
匕首刀柄注释的活动。
@AndroidEntryPoint
class HiltActivity : AppCompatActivity()
推荐阅读
- javascript - 从 AsyncStorage 更新数组
- php - Wordpress | Split queries based on selection
- php - 无需在循环内查询即可获得多个结果
- keras - 在 keras CNN 中获得精确度、召回率、灵敏度和特异性
- javascript - 不确定如何以钩子形式编写此函数
- python - 在 jupyter 笔记本中导入 .ipynb 文件时出错
- javascript - 如何防止工具提示走出屏幕reactjs
- c++ - 我的代码适用于 C++,但在转换为 C 语言时不起作用
- javascript - 如何摆脱这个楠?
- python - why do I get the error "AttributeError: SatTrack instance has no attribute 'show_location"?