如何从Java集成测试修改网络连接?

时间:2012-12-23 14:08:36

标签: java rest networking junit jersey

我编写了一个Java类(MyRestClient),它需要访问第三方RESTful API并使用从其服务器返回的HTTP响应进行一些处理。我现在正在尝试在JUnit和第三方API之间编写一系列成功的集成测试(使用MyRestClient作为基础testng lib),以确保此类在各种情况下正常运行:

  • 一切都很完美(RESTful API调用正确,服务器返回有意义的响应)
  • 错误的API调用和服务器返回应用程序层错误代码
  • 返回各种非200 HTTP代码,包括403,404和500
  • 无网络连接
  • ...等

该列表中的第4项(“无网络连接”)是我目前所坚持的。我正在使用Jersey来执行我的实际REST调用,但是Jersey本身只是基于java.net.*。如果可能的话,我想在我的shouldThrowExceptionOnBadNetworkConnection()测试方法执行时“打破”Jersey / Java发起网络连接的能力,然后将其“打开”,以便下一个测试方法能够表现出来通常

我一直在查看Charles Proxy似乎只是这样做,但似乎没有用于在运行时管理它的Java库。

所以我问:如何针对特定的集成测试“关闭”Java网络?提前致谢。

1 个答案:

答案 0 :(得分:0)

通过声明一个返回URL的受保护方法使MyRestClient可测试,并让它在私有字段中使用它。

在你的JUnit测试中,你是一个覆盖该方法的匿名类,它会返回垃圾:

MyRestClient willFail = new MyRestClient() {
    protected String getUrl() {
        return "http://not.a.real.address";
    }
}

还有一些模拟库可以做类似的事情