[英]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中看到。
一些例子
如果您沒有使用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.