为什么okhttp3.Response类是final的?

6
我试图为一个名为 okhttp3 的类编写单元测试,但是在模拟 okhttp3.Response 类时遇到了困难。
该类被声明为 final,在大多数模拟框架中无法模拟。我不想仅因此使用 Powermock。
通过查看代码,可以发现创建 Response 类的实例并在测试中使用它是可行的,但与仅模拟一个方法相比,它需要更多的代码并且不易阅读(在我的情况下)。
请问 okhttp3.Response 类被声明为 "final" 修饰符的具体原因是什么?或者是否有计划在以后的版本中删除这个修饰符?

1
请问您是否需要 https://github.com/square/okhttp/issues 这个链接?从快速浏览来看,他们似乎不想让他们的类可扩展,因为这样可以更轻松地进行更改。此外,https://github.com/square/okhttp/tree/master/mockwebserver 对您有用吗?其中包含一个“MockResponse”类。 - Petr Janeček
1
在github.com/square/okhttp/issues上,@Slanec明确提到了“问题”的堆栈溢出引用。我无法相信我是第一个为使用okhttp客户端编写单元测试并遇到此问题的人。 - vap78
1
啊,我明白了。可能有一些适合你的好解决方案,但是你首先需要说出你试图实现什么以及为什么要这样做。你为什么要模拟“Response”,使用“MockWebServer”和“MockResponse”不能满足你的需求吗?如果不行,为什么? - Petr Janeček
@Slanec 这似乎是测试 OKHttp 客户端的预期方式。积极的一面是它很真实,因为它打开了服务器套接字,在真实网络上发送响应等等。消极的一面是存在泄漏套接字的风险。您可以将这个作为答案添加上去。 - vap78
1个回答

15

Response 是一个值类,因此不应该被模拟。您可以使用 Response.Builder 创建实例,并根据需要包含任何数据。

没有计划移除 final 修饰符。


但是,当我使用构建器为我的测试创建一个时,如果我使用try()自动关闭,则会出现“响应不符合要求,不得关闭”的错误。 有什么建议吗? - markthegrea
我想通了。我在响应对象中模拟了响应体。 - markthegrea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接