OkHttp结合JUnit4无法获取响应数据问题求助
问题分析
你遇到的问题核心原因是JUnit 4的测试线程会在异步操作完成前提前终止。call.enqueue()是OkHttp的异步请求方法,请求逻辑会在OkHttp的线程池中执行,而JUnit的测试方法会直接执行到方法末尾,此时测试进程就会结束,导致回调里的日志还没来得及输出。
而同步的call.execute()能正常打印日志,是因为它会阻塞当前测试线程,直到请求完全完成后才继续执行后续代码,确保了日志能在测试进程终止前输出。
解决方案
可以使用CountDownLatch来阻塞测试线程,等待OkHttp的异步回调执行完毕后再让测试方法结束。具体修改如下:
import org.junit.Test import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit import okhttp3.Call import okhttp3.Callback import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import java.io.IOException class SingleFileDownloadTest { @Test fun testDownloadSingleFile() { val client = OkHttpClient() val request = Request.Builder().url("https://www.imooc.com/learn/1141").build() val call = client.newCall(request) // 初始化CountDownLatch,计数为1 val latch = CountDownLatch(1) call.enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { e.printStackTrace() latch.countDown() // 计数减1,释放等待的线程 } override fun onResponse(call: Call, response: Response) { println(response.body?.string()) println("resp success") latch.countDown() // 计数减1,释放等待的线程 } }) // 等待回调执行完成,最多等待10秒(可根据需求调整) latch.await(10, TimeUnit.SECONDS) } }
补充说明
CountDownLatch的作用是让测试线程等待,直到异步回调执行完毕(调用countDown())后才继续执行。- 设置超时时间是为了避免因请求异常导致测试线程无限等待。
- 若不需要刻意测试异步逻辑,直接使用同步的
call.execute()是更简单的方案。
内容的提问来源于stack exchange,提问作者stars-one
相关产品推荐
相关产品推荐

