如何测试泽西岛 REST 网络服务?

2022-09-02 21:22:53

我已经编写了一个Restful Web服务,并且必须使用JUnit4对其进行测试。我已经使用泽西岛客户端编写了一个客户端。但想知道我是否只能使用 junit4 测试我的服务。至少有人可以帮我采样吗?

我的 rest 服务具有身份验证方法,该方法采用用户名、密码并返回令牌。

我已经为身份验证方法编写了测试用例。但我不确定如何使用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);
    }
}

答案 1

如果要使用 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 容器,并将 a 仅包含该类加载到服务器。当然,您可以在配置中添加更多类。如果需要,可以使用“真实”资源配置。ResourceConfigService

上面的测试使用此依赖项

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

另一种选择,也是我更喜欢的选择,是使用泽西测试框架,它将为您启动一个嵌入式容器。测试可能看起来更像

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>

嵌入式灰熊容器将在引擎盖下开始,与您的配置。在上面的两个示例中,假设类的值为 ,如测试 URL 所示。ResourceConfig@PathServiceservice

一些资源

一些例子


更新

如果您没有使用Maven,以下是为泽西岛测试Fraemwork运行嵌入式灰熊容器所需的jar。

enter image description here

我通常在这里搜索我所有的罐子。您可以选择版本,下一页中应该有一个链接可供下载。您可以使用搜索栏搜索其他搜索。

这是一个简单的运行示例,一旦你有了所有的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还是子类(如上所示),你都可以通过使用在测试类中内置的单独 、来减少测试的内容,就像我所做的那样。否则,如果您使用的是普通类,则可以在方法中替换它。ResourceConfigResourceConfigResourceConfigconfigure

该方法几乎只是在Java代码中构建一个web.xml文件。您可以在 ,like 中看到不同的方法,这与 Web xml 中的 相同。您可以简单地在参数中使用字符串,但是有一些常量,正如我上面使用的那样。configureWebAppDescriptor.BuilderinitParam<init-param>

这是你通常的 JUnit 测试,它将运行。它正在使用泽西岛客户端。但是,您无需创建 ,只需访问该方法即可使用预配置的,该方法返回 .如果您熟悉泽西岛客户端,那么本课程对您来说应该不是什么新鲜事。@TestClientClientresource()WebResource


答案 2

看看炼金术休息客户端生成器。这可以为您的 JAX-RS Web 服务类生成代理实现,并在后台使用 jersey 客户端。实际上,您将从单元测试中将Web服务方法称为简单的java方法。同时处理 http 身份验证。

如果您需要简单地运行测试,则不涉及代码生成,因此很方便。

这里的演示设置了灰熊,并使用上面的生成器运行 junit 测试。

免责声明:我是这个库的作者。


推荐