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

Android 9中Espresso测试因CLEARTEXT请求失败的解决方法咨询

解决Espresso测试应用在Android 9下的Cleartext网络请求问题

你遇到的问题核心在于:Espresso测试会启动一个独立的测试APK,而非直接在主应用进程中运行,所以主应用清单里的networkSecurityConfig完全不会作用于测试应用的网络请求。下面给你几个可靠的解决方案:

方法一:为测试模块添加自定义清单文件(推荐)

这是最直接且兼容性最好的方式,我们可以给测试模块(androidTest目录)单独配置网络安全规则:

  1. 在androidTest目录下创建AndroidManifest.xml文件,路径为src/androidTest/AndroidManifest.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.your.app.test"> <!-- 替换成你的测试包名,通常是主包名加.test -->

    <application
        android:networkSecurityConfig="@xml/network_security_config_test" />
</manifest>
  1. 在androidTest/res/xml目录下创建network_security_config_test.xml,配置允许明文流量:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- 允许所有请求使用Cleartext -->
    <base-config cleartextTrafficPermitted="true" />
    <!-- 如果只想针对特定域名开放,可以用domain-config -->
    <!--
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">your-test-backend.com</domain>
    </domain-config>
    -->
</network-security-config>

Gradle会自动合并这个测试清单到生成的测试APK中,这样测试应用的网络请求就会允许明文传输了。

方法二:通过代码动态配置(适合快速调试)

如果不想修改清单文件,也可以在测试代码中通过反射动态修改应用的网络安全配置,在测试类的@Before方法中添加:

import android.app.Application
import android.content.Context
import android.net.NetworkSecurityConfig
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Before

class YourEspressoTest {

    @Before
    fun setupNetworkConfig() {
        val context: Context = InstrumentationRegistry.getInstrumentation().targetContext
        val app = context.applicationContext as Application
        
        // 构建允许Cleartext的网络安全配置
        val config = NetworkSecurityConfig.Builder()
            .setCleartextTrafficPermitted(true)
            .build()
        
        // 通过反射修改Application的mNetworkSecurityConfig字段
        val field = Application::class.java.getDeclaredField("mNetworkSecurityConfig")
        field.isAccessible = true
        field.set(app, config)
    }

    // 你的测试用例...
}

⚠️ 注意:反射依赖于系统内部字段,不同Android版本可能有变动,所以长期来看还是推荐方法一。

额外说明

再强调一次:Espresso测试的网络请求是在测试APK进程中发起的,这个APK的清单是独立于主应用的,所以主应用的任何清单修改都不会影响它。通过androidTest目录下的自定义清单,我们可以直接控制测试APK的配置,这是官方推荐的测试模块配置方式。

内容的提问来源于stack exchange,提问作者STARGATEBG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:35:09