gpt4 book ai didi

android - 单元测试 AndroidViewModel 类

转载 作者:太空狗 更新时间:2023-10-29 16:26:18 24 4
gpt4 key购买 nike

我正在为我的应用程序编写单元测试,并且在编写它们时发现了一个“减速带”。在测试 AndroidViewModel 的子类时,我缺少用于初始化的 Application 参数。我已经读过 this question that uses Robolectric .

这是我目前已经尝试过的:

  • 按照问题所述使用 Robolectric。据我了解,Robolectric 可以使用您的自定义应用程序类进行测试,问题是我没有使用自定义应用程序类,因为我不需要它。 (该应用程序并不复杂)。
  • 使用 mockito。 Mockito 抛出一个异常,指出无法模拟 Context 类。
  • 使用 InstrumentationRegistry。我将测试类从测试文件夹移动到 androidTest 文件夹,让我可以访问 androidTestImplementation 依赖项,我尝试使用 InstrumentationRegistry.getContext() 并将其解析为应用程序,当然这没有工作,抛出一个强制转换异常。我觉得尝试这个很愚蠢,但还是值得一试。

我只想实例化我的 AndroidViewModel 类,以便我可以调用它们的公共(public)方法,但需要 Application 参数。我能为此做什么?

fun someTest() {
val testViewModel = MyViewModelThatExtendsFromAndroidViewModel(**missing application parameter**)
testViewModel.foo() // The code never reaches here as the testViewModel cant be initializated
}

最佳答案

我遇到了同样的问题,并找到了两种解决方案。

您可以在单元测试中使用 Robolectric,在测试目录内,并选择 platform Application 类。

@RunWith(RobolectricTestRunner::class)
@Config(application = Application::class)
class ViewModelTest {

@Test
@Throws(Exception::class)
fun someTest() {
val application = RuntimeEnvironment.application
val testViewModel = MyViewModelThatExtendsFromAndroidViewModel(application)
testViewModel.foo()
}

}

或者您可以在 androidTest 目录中使用 InstrumentationTest,并将 InstrumentationRegistry.getTargetContext().applicationContext 转换为 Application:

@RunWith(AndroidJUnit4::class)
class ViewModelTest {

@Test
@Throws(Exception::class)
fun someTest() {
val application = ApplicationProvider.getApplicationContext() as Application
val testViewModel = MyViewModelThatExtendsFromAndroidViewModel(application)
testViewModel.foo()
}

}

希望对您有所帮助!

关于android - 单元测试 AndroidViewModel 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51487892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com