【问题标题】:Passing an HTTP call inside a test context在测试上下文中传递 HTTP 调用
【发布时间】:2012-09-30 17:16:51
【问题描述】:

我正在尝试对我实现的 Spring bean 进行单元测试,但在这里遇到了困难。该 bean 用于在某些场合调用远程 REST 服务。

但是,在我的测试中,我希望它在我的测试上下文中调用模拟 servlet,而不是远程服务器。

调用是使用 Apache 的 httpclient 库进行的,URL 是在 applicationContext 中设置的(所以我可以在测试时向 bean 提供任何假 URI)。该服务应该返回一个流。

调用如下所示:

HttpClient client = new DefaultHttpClient();
URIBuilder builder = new URIBuilder(theURIProvidedInContext);
// set parameters on builder
URI uri = builder.build();

HttpGet get = new HttpGet(uri);
HttpEntity entity = client.execute(get).getEntity();
return entity.getContent();

我整个上午都在 Google 上搜索,但只找到了如何对 servlet 进行单元测试。有人可以在这里提供一些见解吗?

【问题讨论】:

  • 这个 HTTP 调用是如何进行的?你使用一些客户端库吗?它从哪里获取要调用的 URL?
  • 抱歉,我在那个方面不够精确。我编辑了问题以修正这个错误。

标签: java spring unit-testing rest servlets


【解决方案1】:

您将无法在测试上下文中调用模拟 servlet,因为没有应用程序服务器。相反,您可以提取使用 HTTP 客户端的代码以将调用放入单独的 bean,然后对其进行模拟以返回所需的流。

如果它是一个 REST 服务,您可以创建一个带有 JAX-RS 注释的类作为测试替身(我不会称它为模拟),并使用像 Grizzly 或 Jersey 这样的嵌入式服务器启动它。这将为您启动一个 HTTP 服务器。您的注释类可以抛出 404、500 等,具体取决于您希望测试如何进行。见JAX-RS with embedded server

【讨论】:

  • 我很惊讶没有办法启动嵌入式应用程序服务器(或至少模拟一个)。我对 SpringRemoting 进行了一些修改并尝试运行嵌入式 Jetty,但我无法正确配置它。不过,感谢您的回答:拉 HTTP 客户端逻辑确实可以让我有更好的测试覆盖率。
  • @Chop,是的,你当然可以在你的测试中启动 Jetty——我已经在很多项目中做到了。这完全取决于您要测试的内容。对于 unit 测试,最好模拟出所有 HTTP 部分。
  • 假设我想确定当 HTTP 返回 404(未找到要返回的流)或 500 状态时 bean 的行为。模拟它只能让我确保在另一边一切正常时一切正常(可能并非总是如此)。
  • @Chop 在这种情况下,我会使用 JAX-RS 而不是普通的 servlet。 JAX-RS 注释使创建和部署端点变得非常容易。见编辑。
  • 事实上,我在使用 Endpoint 时遇到了一些问题(专为 JAX-WS 而设计,而不是为 JAX-RS 而设计)。然而,通过一些搜索,我发现了如何使用带有 Jersey 注释文件的 Grizzly 嵌入式服务器(有关一些代码,请参见此处:stackoverflow.com/questions/8277409/jax-rs-with-embedded-server)。感谢您指路!
【解决方案2】:

com.rexsl:rexsl-test:mock:0.3.8 尝试com.rexsl.test.ContainerMocker(我是开发人员):

URI home = new ContainerMocker()
  .expectMethod("GET")
  .expectHeader("Accept", Matchers.startsWith("text/"))
  .returnBody("<done/>")
  .returnStatus(200)
  .mock()
  .home();

现在您有了一个带有正在运行的 HTTP 容器的 URI,您可以将其注入到您的类中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多