gpt4 book ai didi

java - 对进行 URL 调用的 servlet 进行单元测试

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:19 32 4
gpt4 key购买 nike

我想为通过 java.net.URL 调用 Web 服务的 servlet 类编写单元测试。

我可以创建模拟请求和响应对象以轻松发送到 servlet 的 doGet 方法(使用 junit 实用程序员文本中的技术),即创建 MockHttpServletRequest、MockHttpServletResponse,并将它们传递给 doGet。

我遇到问题的部分是在 servlet 中打开的 URL。

现在,我只是在调用打开 URL 并返回字符串的函数(生产代码)和调用直接返回固定 URL 字符串的函数(测试代码)之间做出选择代码)

理想情况下,我希望有一个 doGet 方法,其中测试代码是不可见的 - 在进行网络访问的函数和直接返回字符串的函数之间的选择对 doGet 应该是透明的。

我可以想出很多方法来实现这一点,但没有一种感觉是对的。

  • 示例 1:将函数包装在具有 testOn boolean 值和 setTestMode 方法的类中; junit init 可以设置testMode为true,默认为false。 testOn 决定调用哪个方法。不利的是我需要一个新类(class),似乎它可能会失控。

  • 示例2:有两个实现网络访问的类,其中一个是mock;让 junit 重新加载模拟类,生产代码加载常规类(或以某种方式将生产类重新映射到模拟类)。否定:不确定如何做到这一点;看起来很笨拙。

  • 示例 3:有一个带有静态字段的类,指示我是否要使用模拟,并根据字段值调节 servlet 中的 URL 访问。否定:感觉像全局变量。

  • 示例 4:扩展 URL,这样如果我仅切换到 URL(但 java.net.URL 是最终的),生产代码将正常工作。

经过一上午的搜索,我找不到完全正确的答案,因此我求助于 SO 的集体智慧。

谢谢,阿德南

ps - 我应该提到我不必使用 java.net.URL,任何等效的都可以。

最佳答案

您的第二个选项是“正确”选项。对外部 URL 的调用应封装在服务中。然后,该服务被注入(inject)到使用它的 servlet 中。这是一个地方 Inversion of Control派上用场。

在您的单元测试中,您将注入(inject)测试实现,在现实生活中,您将注入(inject)一个真正的实现。它可以像为服务提供一个 setter 并将实现默认为“真实”的一样简单。

这种事情是 IoC/DI 的典型例子。

关于java - 对进行 URL 调用的 servlet 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7854514/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com