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

时间:2014-02-09 01:27:17

标签: 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服务器的响应,包括响应代码,标头字段等。我发现mockwebserver库看起来就像我需要的东西。但是,为了使用它,我需要以某种方式更改类连接到的URL。

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

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

3 个答案:

答案 0 :(得分:2)

传递网址有什么可疑之处?不确定我明白了。

通常对于这样的事情,您不希望URL成为属性吗?我想同样的方式,你的实例的数据库url将由属性构成,你想在这里做同样的事情。在这种情况下,在您的测试中,您只需覆盖属性/ ies。

关于这些测试的另一个有趣的事情是我认为测试实际协议(这是你用模拟做的)以及实际服务然后运行服务测试是一个非常好的主意。一个计划,只是为了确保您正在消费的下游服务仍在那里,并履行合同的终结。正在阅读优秀的Continuous Delivery book from Addison Wesley,正在考虑今天将这部分作为管道。

答案 1 :(得分:2)

如果您先编写测试,那么您将永远不会编写此类代码:)

您的班级违反了单一责任规则。重构这个课程。提取负责网络的部分(在您的代码中 - 获取连接)。然后ServiceAccess应该使用该类。那么你可以在单元测试中轻松测试ServiceAccess。单元测试网络代码毫无意义 - 来自oracle的人已经做到了。您可以测试的只是您提供了正确的参数,而这是集成测试的作用

答案 2 :(得分:0)

如果您无法更改代码,则可以使用PowerMock来模拟HttpURLConnection