Android MockWebServer Dispatch未触发,真实API被调用问题排查
以下是导致MockWebServer未拦截请求、真实API被调用的常见问题,对应你的代码逐一排查:
API基础地址未指向MockWebServer
你的应用代码中如果硬编码了真实API的域名(比如https://your-real-api.com),即使MockWebServer在8080端口启动,请求也不会转向它。必须将测试环境下的API基础地址替换为MockWebServer的地址:// 不要硬编码8080,用MockWebServer提供的url val baseUrl = mockWebServer.url("/").toString() // 将这个baseUrl传入你的网络请求客户端另外,固定使用8080端口可能导致设备/emulator上端口冲突,MockWebServer启动失败,建议让它随机分配端口(调用
mockWebServer.start()不带参数)。MockWebServer启动时机错误
你在init块中启动MockWebServer,但Instrumented测试的生命周期里,init块执行时测试环境可能还未完全准备就绪(比如上下文未初始化),导致启动失败但无明显报错。应该把启动逻辑放到@Before注解的方法中:abstract class BaseInstrumentedTest { private lateinit var mockWebServer: MockWebServer @Before fun setup() { mockWebServer = MockWebServer() mockWebServer.start() // 随机端口,避免冲突 } @After fun after() { mockWebServer.shutdown() } fun setDispatcher(it: Dispatcher){ mockWebServer.dispatcher = it } // 提供获取baseUrl的方法给子类 fun getBaseUrl() = mockWebServer.url("/").toString() }网络客户端未使用测试配置
如果你的应用使用全局单例的OkHttpClient(或Retrofit实例),测试时没有替换为指向MockWebServer的实例,请求依然会走生产环境的配置。需要在测试中重新初始化网络客户端,将baseUrl设置为MockWebServer的地址,或者添加拦截器重定向请求。Dispatcher设置时机过晚
如果你的Activity在启动时立即发起网络请求,而setDispatcher的调用晚于请求发起的时机,此时MockWebServer还未配置Dispatcher,可能导致请求未被拦截。确保在启动Activity/发起请求前,先完成Dispatcher和baseUrl的配置。
内容的提问来源于stack exchange,提问作者LMaker

