测试Jersey Restful服务的单元测试

32

我刚开始学习单元测试,想要在一个项目中测试一些Jersey服务。我们正在使用Junit。请指导我以更好的方式编写测试用例。

代码:

    @GET
    @Path("/getProducts/{companyID}/{companyName}/{date}")
    @Produces(MediaType.APPLICATION_JSON)
    public Object getProducts(@PathParam("companyID") final int companyID,
            @PathParam("date") final String date, @PathParam("companyName") final String companyName)
            throws IOException {
        return productService.getProducts(companyID, companyName, date);
    }

上述服务运作良好,我想编写JUnit测试用例来测试上述方法。 上述方法将以JSON格式检索产品列表 (List<Product>)。 我想编写测试用例来检查响应状态和JSON格式。

注意:我们使用的是Jersey 1.17.1版本。

感谢您的帮助 :)

3个回答

18

对于Jersey Web服务测试,有几个测试框架可供选择,包括:Jersey测试框架(已在其他答案中提到-请在此处查看版本1.17的文档:https://jersey.java.net/documentation/1.17/test-framework.html)和REST-Assured (https://code.google.com/p/rest-assured) - 请在此处比较/设置两者的不同(http://www.hascode.com/2011/09/rest-assured-vs-jersey-test-framework-testing-your-restful-web-services/)。

我发现REST-Assured更加有趣和强大,但是Jersey测试框架也非常易于使用。要编写“检查响应状态和json格式”的测试用例,在REST-Assured中可以编写以下测试代码(与jUnit类似):

package com.example.rest;

import static com.jayway.restassured.RestAssured.expect;
import groovyx.net.http.ContentType;

import org.junit.Before;
import org.junit.Test;

import com.jayway.restassured.RestAssured;

public class Products{

    @Before
    public void setUp(){
        RestAssured.basePath = "http://localhost:8080";
    }

    @Test
    public void testGetProducts(){
        expect().statusCode(200).contentType(ContentType.JSON).when()
                .get("/getProducts/companyid/companyname/12345088723");
    }

}

这应该可以为您解决问题......您还可以非常容易地验证JSON特定元素以及许多其他详细信息。有关更多功能说明,您可以查看REST-Assured的非常好的指南(https://code.google.com/p/rest-assured/wiki/Usage)。另一个很好的教程是这个http://www.hascode.com/2011/10/testing-restful-web-services-made-easy-using-the-rest-assured-framework/

希望这可以帮到您。


这只是一个例子...您可以指定您需要的API终端地址。 - emgsilva
实际上只有这个对我起作用了:`@Before public void setUp() { RestAssured.baseURI = "http://localhost:8080/"; RestAssured.basePath = "/appname"; } ` - ACV
请注意 - 首先应设置 RestAssured.baseURI 为 http://james-willett.com/2015/06/extracting-a-json-response-with-rest-assured/。 - Alex Punnen
2
因为这不是一个单元测试,所以我要点踩。它可以修改为一个单元测试,但正确的 DI 方法在这里没有展示。 - Prathik Rajendran M

9

只需要忽略注释,编写一个正常的单元测试来传递所需的参数。我认为通常会返回类型为“javax.ws.rs.core.Response”的值...此类上有一个可用的getEntity()方法。在这种情况下,使用像Mockito这样的Mock对象框架可能会很有帮助。


@Neeraj.. 谢谢你的回复。如果有的话,能否请你分享一些样本? - Kiran
10
虽然使用这种方法可以轻松实现100%测试覆盖率,但您通常对软件了解甚少。这是一种纯单元测试,有其价值,但您可能希望至少进行一些集成测试,例如URL解析和数据编组。 - Michael Piefel

3

您是否熟悉第26章 Jersey测试框架

该框架是与Jersey Web服务一起使用的测试工具,可以简化集成测试并提高代码质量。
public class SimpleTest extends JerseyTest {

    @Path("hello")
    public static class HelloResource {
        @GET
        public String getHello() {
            return "Hello World!";
        }
    }

    @Override
    protected Application configure() {
        return new ResourceConfig(HelloResource.class);
    }

    @Test
    public void test() {
        final String hello = target("hello").request().get(String.class);
        assertEquals("Hello World!", hello);
    }
}

2
@Mariuszs,感谢您的回复。但是我们正在使用不支持Application和ResourceConfig的Jersey 1.17.1版本。如果您有1.17.1版本的示例,请分享给我们好吗? - Kiran

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