我为我的测试创建了一个模拟拦截器,经过数小时的调试,它成为了100个崩溃的根源。抛出的异常来自使用OkHttpClient:进行改装
java.io.IOException: canceled due to java.lang.IllegalStateException: message == null
无法给你完整的堆栈跟踪,因为运行日志名义上否认返回它。然而,不知何故,我仍然设法得到了导致它的行(因为有一次它被显示(,并发现它在我的MockInterceptor中,它看起来如下:
package package.app
import okhttp3.*
import okio.Buffer
import okio.BufferedSource
import java.io.IOException
import java.io.InputStream
class MockInterceptor(private val stream: InputStream) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val body = MockUpBody(stream)
val content = body.bytes().toString()
return Response.Builder()
.protocol(Protocol.HTTP_2)
// This is essential as it makes response.isSuccessful() returning true.
.code(200)
.request(chain.request())
.body(body)
.build() -> last mentioned line in stack trace
}
}
class MockUpBody(private val stream: InputStream) : ResponseBody() {
override fun contentType(): MediaType? {
return null
}
override fun contentLength(): Long {
//Means length is unknown beforehand
return -1
}
override fun source(): BufferedSource? {
return try {
Buffer().readFrom(stream)
} catch (exception : IOException) {
exception.printStackTrace()
null
}
}
}
我正在读取的流来自一个具有以下内容的文件:
{
"message" : "Vous ajoutez ces offre avec succes",
"backend-id": "1234567abc2346789def"
}
进一步的调试表明,这是正确读取的,因为body.byteStream((.toString函数返回
[size=97 text={rn "message" : "Vous ajoutez ces offre avec succes",rn "backe…].inputStream()
它仍然是人类可读的,但由于某种原因,当我请求字节((.toString((时(我想HttpClient也会这样做(,它会出错,返回以下内容:
[B@2e30b66
字节由responseBodys的内部函数调用产生:
source.readByteArray();
现在,我们知道了,有一个转换错误,我最大的问题是:我在哪里找到问题来解决它?我需要将JSON文件转换成一堆字节并粘贴到文件中吗?或者,我可以以某种方式更改流的读取样式,以便在代码中正确转换它吗?
为了进一步的兴趣,流是这样的:
val stream : InputStream = InstrumentationRegistry
.getInstrumentation()
.context.assets.open("new_message.json")
.bytes()
函数可能返回字节数组(byte[]
(,对吗?数组的.toString()
方法(默认为对象(返回它们的类型和散列(看起来像您收到的输出(。要真正将字节数组转换为String
,您需要显式地转换它:
var string = new String(bytes(), StandardCharsets.UTF_8);