在 robolectric 的测试中使用 hiltViewModel() 和 createComposeRule() 会抛出 NoSuchMethodException

问题描述 投票:0回答:2

我运行以下测试:

@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
神器的一部分。

不幸的是,这个测试在初始化 viewModel 时抛出

NoSuchMethodException

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
android android-jetpack-compose robolectric dagger-hilt
2个回答
2
投票

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

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

而不是

@get:Rule
val composeTestRule = createComposeRule()

其中 HiltActivity 是带有来自匕首柄的

@AndroidEntryPoint
注释的活动。

@AndroidEntryPoint
class HiltActivity : AppCompatActivity()

0
投票

这不起作用,因为 createAndroidComposeRule 需要 ComponentActivity 并且不会接受 CompatAppActvitiy

© www.soinside.com 2019 - 2024. All rights reserved.