用协程测试改造

时间:2019-06-11 12:09:15

标签: android retrofit2 android-testing kotlin-coroutines

如何使用HttpRetrofit正确测试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()
            }
        }
    }

1 个答案:

答案 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'