3

我编写了一个 Java 类 ( MyRestClient),它需要访问第三方 RESTful API 并对从他们的服务器返回的 HTTP 响应进行一些处理。我现在正在尝试在 3rd 方 API 之间编写一系列成功的集成测试(JUnit用作底层 testng 库),MyRestClient以确保此类在各种情况下都能正确运行:

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

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

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

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

4

1 回答 1

0

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

在您的 JUnit 测试中,您使用一个匿名类来覆盖该方法,它是否返回垃圾:

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

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

于 2012-12-23T14:23:54.937 回答