首页 > 解决方案 > 在 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

标签: androidandroid-jetpack-composerobolectricdagger-hilt

解决方案


要解决这个问题,我们必须使用:

@get:Rule
val composeTestRule = createAndroidComposeRule<HiltActivity>()

代替

@get:Rule
val composeTestRule = createComposeRule()

其中HiltActivity是带有@AndroidEntryPoint匕首刀柄注释的活动。

@AndroidEntryPoint
class HiltActivity : AppCompatActivity()

推荐阅读