Android集成WireMock验证请求失败:收到请求列表为空
解决WireMock无法捕获Android测试中对外请求的问题
核心问题
你当前的测试代码直接向http://google.com发送请求,完全没有经过本地运行在8888端口的WireMock服务,因此WireMock无法捕获到任何请求,自然触发验证失败的报错。
修正方案
要让WireMock捕获到请求,必须让所有目标请求先经过WireMock,再由WireMock转发到真实的目标地址。以下是具体修正步骤:
1. 配置WireMock转发规则
在测试中添加Stub规则,让WireMock将接收到的请求转发到真实的google.com地址。
2. 修改请求目标地址
将测试代码中的请求目标改为WireMock的本地服务地址:
- Android模拟器环境下使用
http://10.0.2.2:8888(模拟器的localhost映射到主机的10.0.2.2) - 真机测试使用主机的IP地址加8888端口,或直接用
localhost(需确保真机与主机同网络)
3. 验证请求捕获
执行验证操作,确认WireMock已经接收到请求。
修改后的测试代码
val wireMockRule: WireMockRule = WireMockRule(8888) @get:Rule open val ruleChain: RuleChain = RuleChain .outerRule(grantPermissionRule) .around(wireMockRule) .around(activityRule) @Test fun testWiremock() { // 配置WireMock转发请求到真实的google.com wireMockRule.stubFor(get(anyUrl()) .willReturn(aResponse() .proxiedFrom("http://google.com"))) // 根据测试环境选择对应的WireMock地址 val url = "http://10.0.2.2:8888" val client = OkHttpClient() val request = Request.Builder().url(url).build() val response = client.newCall(request).execute() assertNotNull("请求应返回有效响应", response.body!!.string()) // 验证WireMock捕获到了请求 verify(anyRequestedFor(UrlPattern.ANY)) }
额外说明
- 如果要验证应用本身发出的请求(而非测试代码里的OkHttpClient请求),需要修改应用的网络客户端配置,将代理指向WireMock的地址。
- 确保测试设备/模拟器与运行WireMock的主机处于同一网络,且8888端口未被其他程序占用。
内容的提问来源于stack exchange,提问作者pbelov
相关产品推荐
相关产品推荐

