单元测试AndroidViewModel类

时间:2018-07-23 22:15:47

标签: android unit-testing

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

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

  • 使用问题描述的Robolectric 。据我了解,Robolectric可以使用您的自定义应用程序类进行测试,但事实是我不使用自定义应用程序类,因为我不需要它。 (应用程序并不复杂)。
  • 使用Mockito 。 Mockito抛出一个异常,指出无法模拟Context类。
  • 使用InstrumentationRegistry 。我将测试类从test文件夹移到了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
}

1 个答案:

答案 0 :(得分:5)

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

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

  PROVIDERS = [
    ...PROVIDERS,
    /**
     * Custom providers in development.
     */
    // {
    //   provide: HTTP_INTERCEPTORS,
    //   useClass: MockHttpInterceptor,
    //   multi: true,
    // },
  ];

或者您可以在androidTest目录中使用 InstrumentationTest ,并将 InstrumentationRegistry.getTargetContext()。applicationContext 转换为 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()
    }

}

希望它有所帮助!