簡體   English   中英

如何測試Jersey REST Web服務?

[英]How to test a Jersey REST web service?

我編寫了一個Restful Web服務,必須使用JUnit4進行測試。 我已經使用Jersey Client編寫了一個客戶端。 但是想知道我是否只能使用junit4來測試我的服務。 至少有人可以幫我提供樣品。

我的休息服務具有驗證方法,該方法獲取用戶名,密碼並返回令牌。

我已經為authenticate方法編寫了測試用例。 但我不確定如何使用url進行測試。

public class TestAuthenticate {
    Service service  = new Service();
    String username = "user";
    String password = "password";
    String token;

    @Test(expected = Exception.class)
    public final void testAuthenticateInputs() {
        password = "pass";
        service.authenticate(username, password);
    }

    @Test(expected = Exception.class)
    public final void testAuthenticateException(){
        username = null;
        String token = service.authenticate(username, password);
        assertNotNull(token);
    }

    @Test
    public final void testAuthenticateResult() {
        String token = service.authenticate(username, password);
        assertNotNull(token);
    }
}

如果要使用URL進行測試,則需要從測試中啟動服務器。 您可以顯式啟動嵌入式服務器,這對於測試來說非常常見。 就像是

public class MyResourceTest {

    public static final String BASE_URI = "http://localhost:8080/api/";
    private HttpServer server;

    @Before
    public void setUp() throws Exception {
        final ResourceConfig rc = new ResourceConfig(Service.class);
        server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);       
    }

    @After
    public void tearDown() throws Exception {
        server.stop();
    }

    @Test
    public void testService() {
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target(BASE_URI).path("service");
        ...
    }
}

它基本上是一個集成測試。 您正在啟動Grizzly容器並將ResourceConfig加載到僅具有Service類的服務器。 當然,您可以在配置中添加更多類。 如果需要,您可以使用“真實”資源配置。

上述測試使用此依賴項

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-grizzly2-http</artifactId>
    <version>${jersey2.version}</version>
</dependency>

另一種選擇,我更喜歡的是使用Jersey測試框架 ,它將為您啟動一個嵌入式容器。 測試可能看起來更像

public class SimpleTest extends JerseyTest {

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

    @Test
    public void test() {
        String hello = target("service").request().get(String.class);
    }
}

使用此依賴項

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>${jersey2.version}</version>
    <scope>test</scope>
</dependency>

嵌入式Grizzly容器將在您的ResourceConfig配置下啟動。 在上面的兩個示例中,假設Service類的@Path值是service ,您可以在測試URL中看到。

一些資源

一些例子


UPDATE

如果您沒有使用Maven,那么您需要運行嵌入式Grizzly容器以進行Jersey Test Fraemwork的罐子

在此輸入圖像描述

我經常在這里搜索我所有的罐子。 您可以選擇版本,下一頁應該有一個鏈接供下載。 您可以使用搜索欄搜索其他搜索欄。

這是一個簡單的運行示例,一旦你有了所有的罐子

import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.core.DefaultResourceConfig;
import com.sun.jersey.spi.container.servlet.WebComponent;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import junit.framework.Assert;
import org.junit.Test;

public class SimpleTest extends JerseyTest {

    @Path("service")
    public static class Service {
        @GET
        public String getTest() { return "Hello World!"; }
    }

    public static class AppConfig extends DefaultResourceConfig {
        public AppConfig() {
            super(Service.class);
        }
    }

    @Override
    public WebAppDescriptor configure() {
        return new WebAppDescriptor.Builder()
                .initParam(WebComponent.RESOURCE_CONFIG_CLASS, 
                           AppConfig.class.getName())
                .build();
    }

    @Test
    public void doTest() {
        WebResource resource = resource().path("service");
        String result = resource.get(String.class);
        Assert.assertEquals("Hello World!", result);
        System.out.println(result);
    }
}

你很可能不會在與測試相同的類中擁有資源和ResourceConfig ,但我只想保持簡單並且在一個類中都可見。

無論您使用的是web.xml還是ResourceConfig子類(如上所示),您都可以使用我在測試類中構建的單獨ResourceConfig來減少測試內容。 否則,如果您使用的是普通的ResourceConfig類,則可以在configure方法中替換它。

configure方法幾乎只是用Java代碼構建web.xml文件。 您可以在WebAppDescriptor.Builder看到不同的方法,例如initParam ,它與Web xml中的<init-param>相同。 你可以簡單地在參數中使用字符串,但是有一些常量,正如我上面使用的那樣。

@Test是你常用的JUnit測試。 它正在使用Jersey客戶端。 但是,您只需訪問resource()方法即可返回WebResource ,而無需創建Client ,只需使用預配置的Client即可。 如果您熟悉Jersey客戶端,那么這個課程對您來說不應該是新手。

看看Alchemy rest客戶端生成器 這可以使用場景后面的澤西客戶端為您的JAX-RS Web服務類生成代理實現。 實際上,您將通過單元測試將Web服務方法稱為簡單的Java方法。 處理http身份驗證。

如果您需要簡單地運行測試以便方便,則不會涉及代碼生成。

這里演示設置了灰熊並使用上面的生成器來運行junit測試。

免責聲明:我是這個圖書館的作者。

我認為@peeskillet已經為您提供了必要的先決條件,即您需要在嵌入式Web服務器中運行Web服務。 您還可以方便地查看dropwizard或spring-boot支持。

至於實際驗證響應,我會保持簡單,並使用JUnit和http-matcher(參見https://github.com/valid4j/http-matchers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM