如何使用Http
和Retrofit
正确测试Coroutines
的请求/响应?
我正在使用最新的Retrofit
版本:2.6.0
,它具有suspend
函数的支持。
修改
我还提供了一些易于实现的代码:
ApiInterface
@GET
suspend fun getCountriesListAsync(@Url url: String): Response<ArrayList<Country>>
某些存储库
suspend fun makeCountryApiCallAsync(): Response<ArrayList<Country>> =
treasureApi.getCountriesListAsync(COUNTRIES_API_URL)
在ViewModel
上的实现:
private suspend fun makeCountriesApiCall() {
withContext(Dispatchers.Main) {
switchProgressBarOn()
}
try {
val countriesListResponse = setupRepository.makeCountryApiCallAsync()
if (countriesListResponse.isSuccessful) {
withContext(Dispatchers.Main) {
switchProgressOff()
countriesList.value = countriesListResponse.body()
}
} else {
withContext(Dispatchers.Main) {
showErrorLayout()
}
}
} catch (e: Exception) {
e.printStackTrace()
withContext(Dispatchers.Main) {
showErrorLayout()
}
}
}
答案 0 :(得分:1)
我想你在问如何测试协程?
无论逻辑如何,都应该进行测试。如我所见,您的存储库在Api调用之外不包含任何逻辑。如果是这种情况,您将无法对实时数据进行测试,因为它们不一致,但是您可以使用WireMock或Mockito模拟某些结果,并尝试使其通过您的逻辑。
您可以看看coroutine test support。
这是一个例子
协程测试的必要条件(您可以不做,但是这样做要容易得多)
string query = @"CREATE TABLE IF NOT EXISTS Test (
'ID' INT,
'Name' VARCHAR(5),
'SurName' VARCHAR(6),
'Age' INT
);";
我可以用来模拟通话结果的可选
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.0-M1'
以您给出的示例为例
testImplementation 'com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0'