在测试上下文中传递HTTP调用

时间:2012-10-10 09:15:49

标签: java spring unit-testing rest servlets

我正在尝试对我实施的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进行单元测试。有人可以在这里提供一些见解吗?

2 个答案:

答案 0 :(得分:2)

您无法在测试上下文中调用模拟servlet,因为没有应用程序服务器。相反,您可以提取使用HTTP Client的代码将调用转换为单独的bean,然后模拟该代码以返回所需的流。

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

答案 1 :(得分: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,你可以将它注入你的类中。