2014-02-09 154 views
2

我正在寻找测试内部向预定义的URL发出HTTP请求的类的最佳方法。一般来说,有问题的类看起来或多或少是这样的:如何对内部使用HttpURLConnection的类进行单元测试?

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服务访问库(Twitter4J,RestFB),这些库需要他们的客户端传递URL以便实际使用它们。

我不是Java专家,但我想尽可能地把它弄清楚。欢迎所有的答案。

回答

2

关于传递URL的腥意是什么?不知道我明白了。

通常对于这样的事情,难道你不想要的URL是一个属性?我会以同样的方式来考虑你的实例的数据库url将由属性构成,你会想在这里做同样的事情。在这种情况下,在您的测试中,您只需覆盖属性。

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

+0

这里有几个要点。有单元测试,并有集成测试。对于单元测试,您正在测试ServiceAccess类而不是HttpURLConnection - 其他人已经/应该已经测试过这个类。对于单元测试,你可以/应该嘲笑那个类,它为你提供能力测试,确切地说明从模拟对象所做的任何调用返回的结果。对于集成测试,您正在测试ServiceAccess如何与HttpURLConnection类以及任何其他类一起工作。拥有该网址的属性是很好的设计 - 依赖注入! – mikemil

2

如果你第一次写你的测试,你就从来没有写过这样的代码:)

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

0

如果你不能改变代码,你可以使用PowerMock来模拟HttpURLConnection

相关问题