Тестирование coroutines на spek
Пишу тест для coroutines на Spek. Если retrofit-запрос успешен - значение отправляется в LiveDat. Если запрос не удался -> повтор запроса через 1, 2, 4, 8, 16 (*2...) секунды. Функция работает. Пытаюсь написать тест на нее:
@OptIn(ExperimentalCoroutinesApi::class, DelicateCoroutinesApi::class)
object DefaultCoroutinesViewModelTest : Spek({
val viewModel by memoized { DefaultCoroutinesViewModel() }
val retrofitService by memoized { mock<RetrofitService>() }
describe("get character") {
val id = Random.nextInt()
val response = mock<Response<RickAndMortyCharacter>>()
beforeEachTest {
Dispatchers.setMain(newSingleThreadContext("Test thread"))
runTest {
launch(Dispatchers.Main) {
given(retrofitService.getDataFromApi(id)).willReturn(response)
}
}
viewModel.getCharacter(id)
}
it("must get data from API") {
runTest {
launch(Dispatchers.Main) {
verify(retrofitService).getDataFromApi(id)
}
}
}
}
})
Но когда пытабсь запустить тест, получаю: Wanted but not invoked: retrofitService.getDataFromApi(511291517);. Не могу понять, в чем проблема, что в ходе теста, retrofitService.getDataFromApi() не вызывается?
Моя viewModel:
private const val DEFAULT_REQUEST_DELAY = 1000L
class DefaultCoroutinesViewModel : CoroutinesViewModel() {
override val characterLiveData = MutableLiveData<RickAndMortyCharacter>()
private var requestTimerMSec = DEFAULT_REQUEST_DELAY
private val retrofitService: RetrofitService = RetrofitInstance
.getRetroInstance()
.create(RetrofitService::class.java)
override fun getCharacter(id: Int) {
viewModelScope.launch(Dispatchers.Main) {
val requestResult = kotlin.runCatching {
retrofitService.getDataFromApi(id) }
requestResult.onSuccess {
AppLogger.d("Successful request: character ${it.body()?.name}")
characterLiveData.value = it.body()
}.onFailure {
AppLogger.e("New request after ${(requestTimerMSec / DEFAULT_REQUEST_DELAY).toInt()} sec delay")
delay(requestTimerMSec)
requestTimerMSec *= 2
getCharacter(id)
}
}
}
}