我正在寻找测试一个类的最佳方法,该类在内部向预定义的 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 服务访问库( Twitter4J 、 RestFB )需要其客户端传递 URL 才能实际使用它们。
我不是 Java 高手,但我希望尽可能正确。欢迎所有答案。
最佳答案
传递 URL 有何可疑之处?不确定我明白了。
一般来说,对于这样的事情,您不希望 URL 成为一个属性吗?我会以同样的方式认为您的实例的数据库 url 将由属性构建,您也希望在这里执行相同的操作。在这种情况下,在您的测试中您只需覆盖属性。
关于此类测试的另一个有趣的事情是,我认为对实际协议(protocol)(这就是您对模拟所做的事情)和实际服务进行测试,然后在其上运行服务测试是一个非常好的主意一个时间表,作为确保您正在使用的下游服务仍然存在并履行契约(Contract)结束的一种方式。正在阅读精彩Continuous Delivery book from Addison Wesley ,考虑今天将其作为管道的一部分。关于java - 如何对内部使用 HttpURLConnection 的类进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21654057/