单元测试AndroidViewModel类



我正在为我的应用程序编写单元测试,在编写时发现了一个"减速带"。在测试AndroidViewModel的子类时,im缺少用于初始化的Application参数。我已经读过这个使用Robolectric的问题。

这是我迄今为止已经尝试过的:

  • 使用Robolectric作为问题描述。据我所知,Robolectric可以使用你的自定义应用程序类进行测试,问题是我没有使用自定义应用程序,因为我不需要它。(这个应用程序没有那么复杂(
  • 使用mockito。Mockito抛出一个异常,表示Context类不能被嘲笑
  • 使用InstrumentationRegistry。我将测试类从测试文件夹移到了androidTest文件夹,使我可以访问androidTestImplementation依赖项,我尝试使用InstrumentationRegistry.getContext((并将其解析为Application,当然这不起作用,引发了强制转换异常。尝试这个我觉得很愚蠢,但再一次,这是值得的

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

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

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

您可以在测试目录中的单元测试中使用Robolectric,并选择平台应用程序类。

@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()
}
}

希望它能有所帮助!

最新更新