1

我正在尝试对我实现的 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();

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

4

2 回答 2

2

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

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

于 2012-10-10T10:17:26.243 回答
1

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

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

现在你有了一个运行着 HTTP 容器的 URI,你可以将它注入到你的类中。

于 2012-10-12T09:50:38.347 回答