Java 如何测试Jersey REST web服务?
我已经编写了一个Restful Web服务,必须使用JUnit4对其进行测试。我已经使用Jersey客户端编写了一个客户端。但是我想知道我是否只能用junit4测试我的服务。至少有人能帮我拿样品吗 我的rest服务具有采用用户名、密码并返回令牌的authenticate方法 我已经为认证方法编写了测试用例。但我不知道如何使用url进行测试Java 如何测试Jersey REST web服务?,java,rest,unit-testing,junit,jersey,Java,Rest,Unit Testing,Junit,Jersey,我已经编写了一个Restful Web服务,必须使用JUnit4对其进行测试。我已经使用Jersey客户端编写了一个客户端。但是我想知道我是否只能用junit4测试我的服务。至少有人能帮我拿样品吗 我的rest服务具有采用用户名、密码并返回令牌的authenticate方法 我已经为认证方法编写了测试用例。但我不知道如何使用url进行测试 public class TestAuthenticate { Service service = new Service(); Strin
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容器,并仅使用服务
类将资源配置
加载到服务器。当然,您可以向配置中添加更多类。如果需要,可以使用“真实”资源配置
上面的测试使用这个依赖项
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-http</artifactId>
<version>${jersey2.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
<version>${jersey2.version}</version>
<scope>test</scope>
</dependency>
使用此依赖项
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-http</artifactId>
<version>${jersey2.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
<version>${jersey2.version}</version>
<scope>test</scope>
</dependency>
您很可能不会将资源和ResourceConfig
与测试放在同一个类中,但我只想让它保持简单,并且在一个类中都可见
无论您使用的是web.xml还是ResourceConfig
子类(如上所示),都可以像我所做的那样,通过使用测试类中构建的单独ResourceConfig
来减少测试内容。否则,如果您正在使用普通的ResourceConfig
类,您可以在configure
方法中替换它
configure
方法基本上就是用Java代码构建一个web.xml文件。您可以在WebAppDescriptor.Builder
中看到不同的方法,如initParam
,它与web xml中的
相同。您可以简单地在参数中使用字符串,但是有一些常量,正如我上面使用的
@Test
是将运行的常用JUnit测试。它正在使用Jersey客户端。但是,不必创建客户端
,只需访问resource()
方法即可使用预配置的客户端
,该方法返回WebResource
。如果您熟悉Jersey客户机,那么这个类对您来说应该不是新的。看一看。这可以在幕后使用jersey客户端为JAX-RSWebService类生成代理实现。实际上,您可以从单元测试中将webservice方法称为简单的java方法。处理http身份验证
如果您需要简单地运行测试,那么就不需要生成代码,这样做很方便
安装程序启动grizzly并使用上面的生成器运行junit测试
免责声明:我是此库的作者。我认为@peeskillet为您提供了必要的先决条件,即您需要在嵌入式web服务器中运行web服务。为了方便起见,您还可以查看dropwizard或spring引导支持
至于实际验证响应,我会保持简单并使用JUnit&http matchers(请参见)如果您想使用URL进行测试,那么您需要从测试中启动服务器。您可以使用嵌入式服务器,这在测试中非常常见。或者您可以使用Jersey测试框架,它将为您启动一个嵌入式容器。您使用的是什么Jersey版本?请勾选此[问题][1]它解释了如何模拟您的web服务。[1] :谢谢,但这太令人困惑了。我不能只使用Junit和jmock来编写测试用例吗?而不是用这个灰色的容器?我也是Jmock的新手。你能解释一下“使用url测试”是什么意思吗?我假设您想向URL发出请求。如果没有一个将承载Jersey应用程序的容器运行到,您就无法做到这一点。除非你是说别的,是的。我必须向ws提出请求。我的ws是在tomcat中运行的。所以,现在我明白了,要使用RESTWeb服务,我们必须使用JerseyTest框架或Rest-Assured框架以及Junit(而不是req),我们不能单独使用Junit。如果我错了,请纠正我。很好的解释,用于实现的设置文档和对这个问题的全面完美回答。谢谢你。我甚至不知道Jersey有一个内置的服务器容器可以作为模拟测试配置调用。这使得为测试覆盖率测试简单的服务方法变得容易。