【问题标题】:Unit test fails for coroutine if "by inject{parametersOf("someValue")}" is present within coroutine如果协程中存在“by inject{parametersOf("someValue")}”,则协程的单元测试失败
【发布时间】:2021-01-24 18:17:46
【问题描述】:

我的 viewModel 中有一个协程,它运行得非常好。当我尝试对其进行单元测试时,它会引发以下错误“Could not create instance for [type:Factory,primary_type:..MyService

我正在注入服务并进行 API 调用,这在单元测试时工作正常。如果 API 失败,我将使用具有不同参数的新服务实例重试相同的 API 调用。这在我的应用程序中运行良好,但在单元测试中失败。下面是代码:

coroutineScope.launch {
        try {
            var getResponse = myApi?.getCodeApi()
            if (getResponse?.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
                // Retrying with instance of service with a different token
                val newMyApiService: MyService? by inject { parametersOf(newToken) }
                getResponse = newMyApiService?.getCodeApi()

            }
            checkResponse(getResponse)
        } catch (exception: Exception) {
            Timber.e(exception)
        }
    }

有没有办法解决这个问题?我已经为测试环境采取了所有必要的措施,比如startingKoinApp,在开始测试之前还包括了所需的Koin模块。

单元测试的一部分看起来像这样

 whenever(myAPi.getCodeApi()).thenReturn(properResponse)
        val errorResponse : Response<DataModel> = mock()
        whenever(response.code()).thenReturn(HttpsURLConnection.HTTP_UNAUTHORIZED)
        whenever(myAPi.getCodeApi()).thenReturn(errorResponse)

【问题讨论】:

    标签: android kotlin-coroutines koin android-unit-testing


    【解决方案1】:

    这可以通过替换行来解决

    val newMyApiService: MyService? by inject { parametersOf(newToken) }
    

    val newMyApiService: getNewService(newToken)
    

    新方法将是

    fun getNewService(newToken: String): MyService? {
      return MyService? by inject { parametersOf(newToken) }
    }
    

    现在在您的单元测试中,您可以使用 power mockito 模拟该方法

    val underTestsSpy = PowerMockito.spy(underTests)
            PowerMockito.doReturn(myserviceApi).`when`(underTestsSpy, 
     "getNewService", newToken)
    

    通过这个,您可以模拟在被测试方法中创建的新服务实例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2022-01-11
      • 2019-04-15
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多