如果协程中存在 "by inject{parametersOf("someValue")}",则协程的单元测试失败
Unit test fails for coroutine if "by inject{parametersOf("someValue")}" is present within coroutine
我的 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)
通过这个,您可以模拟在被测试方法中创建的新服务实例
我的 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)
通过这个,您可以模拟在被测试方法中创建的新服务实例