Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试Jersey REST web服务?_Java_Rest_Unit Testing_Junit_Jersey - Fatal编程技术网

Java 如何测试Jersey REST web服务?

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

我已经编写了一个Restful Web服务,必须使用JUnit4对其进行测试。我已经使用Jersey客户端编写了一个客户端。但是我想知道我是否只能用junit4测试我的服务。至少有人能帮我拿样品吗

我的rest服务具有采用用户名、密码并返回令牌的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容器,并仅使用
服务
类将
资源配置
加载到服务器。当然,您可以向配置中添加更多类。如果需要,可以使用“真实”资源配置

上面的测试使用这个依赖项

<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有一个内置的服务器容器可以作为模拟测试配置调用。这使得为测试覆盖率测试简单的服务方法变得容易。