java - 如何对内部使用 HttpURLConnection 的类进行单元测试?

标签 java unit-testing junit

我正在寻找测试一个类的最佳方法,该类在内部向预定义的 URL 发出 HTTP 请求。一般来说,所讨论的类或多或少看起来像这样:

public class ServiceAccess {
    private static final String SERVICE_URL = "http://someservice.com/";
    public ServiceAccess(String username) throws IOException, 
        UserNotFoundException, MalformedURLException {
        URL url = new URL(SERVICE_URL + username);
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        if(conn.getResponseCode() == HTTP_NOT_FOUND) {
            throw new UserNotFoundException("user not found : " + username);
        }
        // and some more checks
    }
}

我想测试该类是否正确响应 HTTP 服务器的响应,包括响应代码、 header 字段等。我找到了mockwebserver图书馆看起来就像我需要的东西。但是,为了使用它,我需要以某种方式更改该类连接到的 URL。

我看到的唯一明智的选择是在构造函数中传递 URL:但是,在我看来,这在设计方面效果不太好,因为要求客户端将 URL 传递给这样的类看起来腥。此外,我还没有看到任何其他 Web 服务访问库( Twitter4JRestFB )需要其客户端传递 URL 才能实际使用它们。

我不是 Java 高手,但我希望尽可能正确。欢迎所有答案。

最佳答案

传递 URL 有何可疑之处?不确定我明白了。

一般来说,对于这样的事情,您不希望 URL 成为一个属性吗?我会以同样的方式认为您的实例的数据库 url 将由属性构建,您也希望在这里执行相同的操作。在这种情况下,在您的测试中您只需覆盖属性。

关于此类测试的另一个有趣的事情是,我认为对实际协议(protocol)(这就是您对模拟所做的事情)和实际服务进行测试,然后在其上运行服务测试是一个非常好的主意一个时间表,作为确保您正在使用的下游服务仍然存在并履行契约(Contract)结束的一种方式。正在阅读精彩Continuous Delivery book from Addison Wesley ,考虑今天将其作为管道的一部分。

关于java - 如何对内部使用 HttpURLConnection 的类进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21654057/

相关文章:

java - 如何使用 spring 云流 RabbitMQ 发送和等待返回消息?

java - 无法解析符号 SetOnEditorActionListener

java - 使用 Maven 进行 Google App Engine 数据存储单元测试

android - 如何在二维风格中指定单元测试文件夹

java - 如何在 Presenters 方法中模拟新创建的对象?

java - 将 ActionListener 添加到 JButton

java - IntelliJ 中的本地 Tomcat - 无法运行程序 catalina.bat

unit-testing - 我应该有失败的测试吗?

junit - 如何在 Android Studio 中将测试方法或类作为 Android 测试运行

java - Intellij 资源子文件夹不包含在类路径中