#android #kotlin #mockk #mockk-verify
Вопрос:
Я хочу протестировать эту функцию.
suspend fun fetchTwoDocs() =
coroutineScope {
val deferredOne = async { fetchDoc(1) }
val deferredTwo = async { fetchDoc(2) }
deferredOne.await()
deferredTwo.await()
}
Как протестировать эту функцию в mockk
Комментарии:
1. Вы хотите протестировать эту функцию или издеваться над этой функцией?
2. Мне нужны оба @Joffrey
3. Было бы неплохо, если бы вы могли быть немного более конкретными в отношении того, что именно вы хотите сделать. Вы хотите заглушку
fetchDoc
и протестироватьfetchTwoDocs
? Или проверить некоторые вызовы? Пожалуйста, поделитесь своим тестовым кодом, который вы бы написали, если бы функция не была приостановлена, и укажите, что не работает, когда вы пытаетесь использовать ее с функциями приостановки. Так будет намного проще помочь вам.4. Кроме того, функция, которую вы написали, возвращает только значение второго вызова, это предназначено? Если это сделано специально, вам не нужен
await()
первый (coroutineScope
уже ожидает дочерних сопрограмм)5. @Joffrey Я хочу протестировать функцию с помощью заглушки вызова, а также проверить. Я новичок в тестировании. Я не знаю, как запустить и заглушить все эти функции.
Ответ №1:
Я предполагаю, что вы не можете или не будете переписывать код, который вы пишете, для использования сопрограмм. В этом случае Паблиско предложил отличные идеи здесь. Больше всего мне понравилось использовать очередь:
// You create a sync queue
val queue = SynchronousQueue<String>() // Or the type of 'fetch2Docs'
// fetchTwoDocs runs async so it will return eventually
queue.put(fetchTwoDocs())
// queue.take() will wait until there is a value in the queue
assertThat(queue.take(), equalTo("expected value"))
Вот дополнительный пример того, как использовать это в гипотетическом асинхронном обратном вызове:
val queue = SynchronousQueue<String>()
asyncFunctionThatReturnsWithCallback(someParam) { callbackParam ->
queue.put(callbackParam)
}
assertTrue(queue.take())
Ответ №2:
Если вы просто хотите протестировать функцию, вы можете просто вызвать ее внутри runBlocking
из своего теста или использовать библиотеку kotlinx-coroutines-test, которая предоставляет runBlockingTest
:
@Test
fun test() = runBlocking {
val result = fetchTwoDocs()
// then assert stuff
}