首页 > 解决方案 > 如何对名为 CoroutineScope.launch 的函数进行单元测试

问题描述

给定suspend fun

private suspend fun fun1(arugment1: String): NetworkResult<Unit>

单元测试下面的fun2和fun3如何

Q1:调用suspend fun的函数:

fun fun2(argument1: String) {
    launch {
        CustomService().fun1(argument1))
                .onSuccessEmpty { _: Int, _: Headers ->
                    Log.d("TEST", "onSuccessEmpty")
                }
                .onSuccess { _: Int, _: Headers, _: Unit ->
                    Log.d("TEST", "onSuccess")
                }.onError {
                    Log.d("TEST", "onError $it")
                }
    }
}

问题二:

fun fun2(argument1: String) {
        runBlocking {
            CustomService().fun1(argument1))
                    .onSuccessEmpty { _: Int, _: Headers ->
                        Log.d("TEST", "onSuccessEmpty")
                    }
                    .onSuccess { _: Int, _: Headers, _: Unit ->
                        Log.d("TEST", "onSuccess")
                    }.onError {
                        Log.d("TEST", "onError $it")
                    }
        }
    }

标签: unit-testingkotlinkotlin-coroutines

解决方案


由于我们从不想让测试中的顶级函数挂起,所以我们总是以阻塞方式运行它们。所以正确的方法是Q2. 由于Q1uses launch,它只是一劳永逸。(我可能误解了你的问题,但我相信你在问这两种方法中哪一种更好。)


推荐阅读