1

一些要点澄清这不是有人建议的重复问题:


原始问题:

我正在使用Expressoand进行 Android Web 服务测试MockWebServer,但是我遇到以下异常,告诉我日志标记问题:

“okhttp3.mockwebserver.MockWebServer”超过 23 个字符的限制。

详细的堆栈跟踪如下:

2020-08-13 11:31:13.277 16901-17085/com.xxx.app I/okhttp.OkHttpClient: <-- HTTP FAILED: java.net.SocketTimeoutException: timeout
2020-08-13 11:31:13.280 16901-17346/com.xxx.app E/AndroidRuntime: FATAL EXCEPTION: MockWebServer TaskRunner
    Process: com.xxx.app, PID: 16901
    java.lang.IllegalArgumentException: Log tag "okhttp3.mockwebserver.MockWebServer" exceeds limit of 23 characters
    
        at android.util.Log.isLoggable(Native Method)
        at okhttp3.internal.platform.android.AndroidLog.androidLog$okhttp(AndroidLog.kt:66)
        at okhttp3.internal.platform.android.AndroidLogHandler.publish(AndroidLog.kt:39)
        at java.util.logging.Logger.log(Logger.java:615)
        at java.util.logging.Logger.doLog(Logger.java:636)
        at java.util.logging.Logger.log(Logger.java:725)
        at okhttp3.mockwebserver.MockWebServer$serveConnection$$inlined$execute$1.runOnce(TaskQueue.kt:224)
        at okhttp3.internal.concurrent.TaskRunner.runTask(TaskRunner.kt:116)
        at okhttp3.internal.concurrent.TaskRunner.access$runTask(TaskRunner.kt:42)
        at okhttp3.internal.concurrent.TaskRunner$runnable$1.run(TaskRunner.kt:65)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:762)
2020-08-13 11:31:13.293 16901-17346/com.xxx.app I/Process: Sending signal. PID: 16901 SIG: 9
4

2 回答 2

1

在深入研究了MockWebServer.kt. 在此文件中,有如下属性:

private val logger = Logger.getLogger(MockWebServer::class.java.name)

MockWebServer::class.java.name返回一个完整的类名okhttp3.mockwebserver.MockWebServer,显然,这个名称作为 Android 日志标签已经超过 23 个字符。修复方法是使用 Kotlin 反射来替换 logger 属性。反射代码如下:

fun <T : Any> T.setPrivateProperty(variableName: String, data: Any): Any? {
    return javaClass.getDeclaredField(variableName).let { field ->
        field.isAccessible = true
        field.set(this, data)
        return@let field.get(this)
    }
}

@before方法内部,使用simpleName

val mockWebServer = MockWebServer() // this is declared inside test class.

@Before
fun setup() {

    mockWebServer.setAndReturnPrivateProperty("logger", 
        Logger.getLogger(MockWebServer::class.java.simpleName))

    mockWebServer.start(8080)
}    

MockWebServer::class.java.simpleName将返回一个较短的类名并解决问题。

于 2020-08-13T05:43:11.243 回答
0

这是因为 Log API 不允许超过 23 个字符的标签。

您可以按照Terence 的回答禁用 lint 检查,但已收到警告。

为了更好地理解访问: 日志标签最多可以是 23 个字符

于 2020-08-13T03:59:31.627 回答