【问题标题】:Unit testing jersey Restful Services单元测试球衣 Restful Services
【发布时间】:2014-02-20 05:34:32
【问题描述】:

我是单元测试的新手,我想在一个项目中测试一些球衣服务。我们正在使用 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 版本。

我们将不胜感激:)

【问题讨论】:

    标签: java json unit-testing rest junit


    【解决方案1】:

    你熟悉Chapter 26. Jersey Test Framework吗?

    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);
        }
    }
    

    【讨论】:

    • @Mariuszs.. 谢谢你的回复兄弟。但是我们使用的是 jersey 1.17.1 版本,它不支持 Application 和 ResourceConfig。如果有,请分享 1.17.1 示例吗?
    【解决方案2】:

    对于 Jersey Web 服务测试,有几个测试框架,即:Jersey Test Framework(已在其他答案中提到 - 请参阅此处的 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 测试框架也很容易使用。在 REST-Assured 中编写一个“检查响应状态和 json 格式”的测试用例,您可以编写以下测试(非常像您在 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/

    HTH。

    【讨论】:

    • 这只是一个例子……你可以指定你需要的API端点的地址。
    • 实际上只有这对我有用:@Before public void setUp() { RestAssured.baseURI = "http://localhost:8080/"; RestAssured.basePath = "/appname"; }
    • 注意 - 应先设置 RestAssured.baseURI james-willett.com/2015/06/…
    • 投反对票,因为这不是单元测试。可以修改为1,但是正确的DI方法这里就不展示了,
    【解决方案3】:

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

    【讨论】:

    • @Neeraj.. 感谢您的回复。有的话可以分享一下样品吗?
    • 虽然您使用这种方法很容易获得 100% 的覆盖率,但您通常对您的软件知之甚少。这是一个纯单元测试,有其价值,但您可能希望至少同时测试一些集成,例如 URL 解析和数据编组。
    猜你喜欢
    • 2011-05-27
    • 1970-01-01
    • 2023-03-05
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2020-07-27
    相关资源
    最近更新 更多