Mocking of HTTP Server in Java

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

最近,我解释了一个流利的Java HTTP客户端,主要用于使HTTP交互比其他可用的客户端更面向对象,包括:Apache ClientJersey Client和普通的HttpURLConnection

这个客户端包含在jcabi-http的Maven构件中。然而,使用jcabi-http的好处不仅仅是客户端部分。Jcabi还包括一个服务器组件,可以帮助您对HTTP客户端进行单元测试和集成测试。

让我先给您展示一个例子。在这个例子中,我使用hamcrest进行断言。

现在,让我们来探索这里发生了什么。

在前几行中,我创建了一个MkContainer的实例,它实际上有四个方法:next(MkAnswer)start()stop()home()

它作为一个带有“先进先出”队列的HTTP服务器工作。我们添加答案,服务器会在响应HTTP请求时返回它们。

服务器在调用start()时启动,调用stop()时停止。它的方法home()返回其“主页”的URL。然后服务器会绑定到一个随机分配的TCP端口。

容器会找到第一个可用且未被占用的端口。

在上面的示例中,我只添加了一个答案。这意味着容器只会对第一个带有该答案的HTTP请求进行回复,而后续的请求都会导致HTTP响应状态为“内部服务器错误 500”。

在第5到第8行,我向已经启动的服务器发起了一个HTTP请求。此外,我断言HTTP响应的正文包含文本“hello”。显然,这个断言会通过,因为服务器会将“hello, world!”作为我的第一个请求的返回值。

正如您所见,我使用container.home()来获取服务器的URL。建议您允许容器找到第一个未占用的TCP端口并绑定到该端口。然而,如果您需要指定自己的端口,可以使用一参数方法start(int)MkContainer中进行配置。

我使用try/finally来安全停止容器。在单元测试中,这并不是关键,因为您可以简化代码并且不需要停止容器。此外,容器将与JVM一起被终止。然而,为了清晰起见,我建议您在finally块中停止容器。

在第12行,我要求已停止的容器给我提供它收到的第一个请求。这个机制在概念上类似于模拟框架的”verify”技术。例如,Mockito

MkQuery的一个实例暴露了有关查询的信息。在这个例子中,我获取了HTTP请求的所有头部,并断言"User-Agent"头部存在,并且至少有一个值等于"Myself"

这种模拟技术在jcabi-github的单元测试和集成测试中被广泛使用,它是一个用于GitHub API的Java客户端。在开发中,这种技术非常重要,可以检查发送到服务器的请求,并验证它们是否符合我们的要求。在这里,我们使用jcabi-http进行模拟。

与客户端一样,您需要jcabi-http.jar依赖项(在Maven Central中获取其最新版本):

除上述之外,您还需要添加一个依赖项,即Grizzly HTTP服务器。MkGrizzlyContainer是基于它构建的。

如果您有任何问题或建议,请通过GitHub问题页提交。一如既往,欢迎报告错误。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-18 at 05:04

sixnines availability badge   GitHub stars