微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果协程中存在“by injection{parametersOf("someValue")}”,协程的单元测试将失败

如何解决如果协程中存在“by injection{parametersOf("someValue")}”,协程的单元测试将失败

我的 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)

解决方法

这可以通过更换线来解决

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)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。