You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:22:15