Espresso UI测试:MockWebServer无法被AVD内应用访问的问题咨询
MockWebServer无法被AVD应用访问的问题解决与分析
你的猜测部分正确,但MockWebServer本质是真正的HTTP服务器,只是默认绑定规则导致了跨进程/设备访问失败,以下是具体分析和解决方案:
核心根因
- MockWebServer默认绑定的是
127.0.0.1(本地回环地址),这个地址仅能接收同一JVM进程内的请求。AVD通过10.0.2.2访问宿主机器的公共网络接口,但MockWebServer没监听该接口,因此请求超时。 - 单元测试能正常工作,是因为测试代码和MockWebServer在同一进程;而Espresso UI测试中,测试进程与目标应用进程是分离的,跨进程访问自然失败。
解决方法
让MockWebServer绑定到所有可用网络接口(即0.0.0.0),允许外部设备/进程访问:
val mockWebServer = MockWebServer() // 绑定到0.0.0.0,监听所有网络接口 mockWebServer.start(InetAddress.getByName("0.0.0.0"), 8080) // 给应用的请求地址用AVD指向宿主的固定IP:10.0.2.2 val apiBaseUrl = "http://10.0.2.2:${mockWebServer.port}"
额外注意:
- 检查宿主机器防火墙是否拦截了8080端口的入站请求,必要时临时放行该端口。
- 若AVD使用桥接网络模式,需改用宿主机器的局域网IP(如
192.168.x.x)替代10.0.2.2。
其他可能根因排查
- 端口冲突:用
lsof -i :8080(macOS/Linux)或netstat -ano | findstr :8080(Windows)检查8080端口是否被其他程序占用,导致MockWebServer未成功绑定。 - 地址配置错误:确保应用请求的base URL是
10.0.2.2:8080,而非localhost:8080(AVD的localhost指向自身虚拟机,不是宿主)。 - 测试进程启动时机:确保MockWebServer在应用启动前完成初始化并绑定端口,避免应用发起请求时服务器未就绪。
结论
你的需求完全可以实现,核心是修改MockWebServer的绑定地址为0.0.0.0,同时让应用使用AVD指向宿主的专用IP地址发起请求。
内容的提问来源于stack exchange,提问作者Lukas K
相关产品推荐
相关产品推荐

