вам нужно выполнить незначительный рефакторинг, чтобы уменьшить связь между Request
и NetworkCaller
, затем использовать этот фиктивный объект только для отметки, если функции были вызваны
object : CancellableAction {
override fun call() {
callFunctionInvoked = true
}
override fun cancel() {
cancelFunctionInvoked = true
}
}
Класс
package org.example
import kotlinx.coroutines.suspendCancellableCoroutine
interface CancellableAction {
fun call()
fun cancel()
}
class NetworkCaller : CancellableAction {
override fun call() {
// performs some real operation
}
override fun cancel() {
// .... cancels the request
}
}
class Request(val call: CancellableAction) {
suspend fun asyncRequest(): String = suspendCancellableCoroutine { continuation ->
continuation.invokeOnCancellation {
call.cancel() // i need to write a test to mock if call.cancel is getting called or not
}
// rest of the code...
}
}
Тестовый файл
package org.example
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.junit.Test
internal class NetworkCallerTest {
@Test
fun testRequestCancellation() {
var callFunctionInvoked = false
var cancelFunctionInvoked = false
val request = Request(object : CancellableAction {
override fun call() {
callFunctionInvoked = true
}
override fun cancel() {
cancelFunctionInvoked = true
}
})
val job = GlobalScope.launch {
val response = request.asyncRequest()
println(response)
}
runBlocking {
job.cancel()
job.join()
}
assert(cancelFunctionInvoked)
}
}