如果您想使用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容器,并将一个只包含Service
类的ResourceConfig
加载到服务器中。当然,您可以向配置中添加更多的类。如果您想要,您可以使用“真实”的资源配置。
上述测试使用了这个依赖项。
<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>
在幕后,将使用您的 ResourceConfig
配置启动嵌入式 Grizzly 容器。在上面的两个示例中,假设 Service
类的 @Path
值为 service
,正如您在测试 URL 中看到的那样。
一些资源
一些示例
更新
如果您不使用 Maven,则需要以下 jar 包才能运行用于 Jersey 测试框架的嵌入式 Grizzly 容器
![enter image description here](https://istack.dev59.com/txOcs.webp)
我通常在这里搜索所有我的 jar 包。您可以选择版本,下一页应该有一个下载链接。您可以使用搜索栏搜索其他jar包。
一旦您拥有了所有的jar包,这是一个简单的运行示例
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()
方法以使用预配置的Client
,而不是创建Client
。如果您熟悉Jersey客户端,则此类对您来说应该不陌生。