仪器测试中的Internet访问

问题描述

我正在尝试通过Android Instrumented测试访问我们的其中一台服务器。 我在装有Android 10的设备上运行测试,并获得以下异常:

Permission denied (missing INTERNET permission?)

为避免这种情况,我尝试了(我正在使用Kotlin)

@Rule
@JvmField
var runtimePermission = GrantPermissionRule.grant(Manifest.permission.INTERNET)

但是在这种情况下,我遇到了这个错误

junit.framework.AssertionFailedError: Failed to grant permissions

即使以下代码也没有成功:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        getInstrumentation().getUiAutomation().executeShellCommand(
                "pm grant " + context.getPackageName()
                        + " android.permission.INTERNET");
}

是否有可能实现我的目标?

[更新]这是一个最小测试:

class Minimal {

@Rule
@JvmField
var runtimePermission: GrantPermissionRule = GrantPermissionRule.grant(Manifest.permission.INTERNET)

@Test
fun minimalReproducible() {

    val buffer = Chararray(2000)
    val url = URL("https://example.net/new-message.PHP")
    val connection = url.openConnection() as HttpsURLConnection
    connection.requestMethod = "POST"

    val urlParameters: String = ""      // buildParameterUrlString(params)

    connection.doOutput = true
    val outputStream = DataOutputStream(connection.outputStream)
    outputStream.writeBytes(urlParameters)
    outputStream.flush()
    outputStream.close()
    val responseCode = connection.responseCode
  }
}

解决方法

您的清单上可能会丢失

<uses-permission android:name="android.permission.INTERNET" />