如何为JERSEY Web服务编写最佳测试用例?

12

我使用Jersey库实现了JAX-RS web服务,现在想对其进行测试。为了达到这个目的,我想通过使用模拟服务来预初始化此服务。

最佳方法是什么,以便在我的测试中托管此服务并执行测试调用?

@Path("/srv")
public class MyService
{
   @GET
   public void action(@Context UriInfo uri)
   { ... }
}

@Test
public void myTest()
{
   MyService service = new MyService();
   service.setSomething(...);

   // How do I host it?

   // How do I call it?
}

几乎是问题911805的完全副本 - 你是在询问与Jersey相关的还是一般的JAX-RS测试技巧? - Phil M
我知道如何测试JAX-RS,但我正在尝试弄清楚如何使用特定的实现(Jersey和Restlet)。如果其中一个能为我提供可接受的解决方案-这将是我们产品技术选择。目前我正在使用Jersey,但显然它没有为我提供仅启动一个特定服务的方法。它只会启动整个服务器并提供所有可以找到的服务。我需要一种方法来组装要测试的服务,并使用预定义的模拟数据。 - IgorM
你找到了一种将REST资源与模拟组装在一起的方法吗?我也在尝试同样的事情。 - Theo
6个回答

9
新的(修订版)Jersey测试框架是Jersey 1.1.2-ea版本的一部分,现在支持进程内或内存中测试。为了在内存中运行您的测试,您只需要将属性test.containerFactory设置为com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainerFactory,即按以下方式运行您的测试:mvn clean test -Dtest.containerFactory=com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainerFactory -DenableLogging。有关更多详细信息,请查看标题为“Jersey测试框架再次审视!”的博客文章,网址为http://blogs.oracle.com/naresh

InMemory和@Context一起使用吗?它不会为我设置它。这会导致它抛出异常。(而且这些异常被记录在4000行之前,同时重新抛出一个没有消息和原因的ErrorMessagesException。</rant>) - Partly Cloudy

5
我相信Jersey测试框架可以解决您的需求。它允许您部署单个服务并运行所有测试。您可以使用该框架对Grizzly Web容器、嵌入式GlassFish和/或HTTPServer运行测试。
请注意,您也可以使用该框架对常规Web容器(如GlassFish和Tomcat)运行测试。如果您还有任何疑问,请随时给我或Jersey用户邮件列表-users@jersey.dev.java.net发送电子邮件。

该框架不允许在测试定义的同一位置初始化服务实例。仍然需要通过配置文件启动整个服务器。 - IgorM

2
我没尝试过,但像HtmlUnit或HttpUnit这样的JUnit扩展可能是测试JAX-RS/Jersey服务的好方法。测试用例可以使用XPath查找期望的返回值,并根据期望的值验证返回的值。有关更多信息,请参见:http://htmlunit.sourceforge.net/gettingStarted.html

1
你可以使用Grizzly来托管服务,然后使用Jersey Client来访问它们。看一下示例应用程序。例如,在Bookstore示例中,您可能会发现TestSupport类和JerseyTest类(在jersey-test-framework中找到)特别有用。
希望这可以帮助你。
(不幸的是,Stack Overflow不允许我发布带有超链接的内容,所以祝你谷歌愉快!)。

0

好的,我现在明白了。目前框架不支持IN PROCESS,但我们正在努力解决。 我们将会在未来版本的Jersey测试框架中添加这个支持。


谢谢您的回复。您计划何时完成?这是测试过程中非常重要的一部分 - “正在进行”允许开发人员正确初始化服务/组件并模拟相关部分以将其与系统的其余部分隔离,并启用期望的断言。没有其他方法可以解决这个问题。 - IgorM
我现在无法给出截止日期,但会尽快添加此支持。一旦准备就绪,我会及时通知您。 - Naresh

0

你有考虑过使用Jersey测试框架吗?不幸的是,它仍然更像是集成测试而不是单元测试,但它可能会帮助你入门。


是的,我看到了。这就是它是一个集成测试的问题所在。为了避免集成测试,我应该能够创建服务类的真实实例,使用模拟进行初始化,然后将其传递给Jersey以在进程中托管。 - IgorM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接