是否可以编写与 JAX-RS 实现无关的 JUnit 测试?

Is it possible to write JUnit tests that are agnostic to your JAX-RS implementation?

我使用 JAX-RS 编写了一个 REST Web 服务,它对我选择的特定 JAX-RS 实现一无所知。我碰巧在使用 TomEE,这意味着我的 JAX-RS 实现是 ApacheCXF。

我想为对 JAX-RS 实现一无所知的 Web 服务编写单元测试。这可能吗?到目前为止,我发现的每个示例都涉及使用来自特定 JAX-RS 实现的 类(ApacheCXF 的 JAXRSClientFactory、Jersey 测试框架等)。

我已经开始试用 tomee-embedded,并且能够测试我的 EJB,但它似乎无法启动 REST 服务。

我的解决方案是将 Arquillian 与嵌入式 TomEE 搭配使用。 Arquillian 提供了大量的功能,但我只将它用于 start/stop Embedded TomEE。因此,我需要做的就是将其添加到我的 pom.xml:

<dependency>
    <groupId>org.apache.openejb</groupId>
    <artifactId>arquillian-tomee-embedded</artifactId>
    <version>${tomee.version}</version>
    <scope>test</scope>
</dependency>

然后我可以用一些额外的 Arquillian 东西和普通的 JAX-RS 编写一个 JUnit 测试:

@RunWith(Arquillian.class)
public class MyServiceIT {

    @ArquillianResource
    private URL webappUrl;

    @Deployment()
    public static WebArchive createDeployment() {
        return ShrinkWrap.create(WebArchive.class)
            .addClasses(MyService.class)
            .addAsWebInfResource("META-INF/persistence.xml") //Refers to src/main/resources/META-INF/persistence.xml
            .addAsWebInfResource("test-resources.xml", "resources.xml") //Refers to src/test/resources/test-resources.xml
            .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
    }

    @Test
    public void randomTest() throws URISyntaxException {
        //Get data from the web service.
        Client client = ClientBuilder.newClient();
        WebTarget webTarget = client.target(webappUrl.toURI().resolve("myentity"));
        Response response = webTarget.request(MediaType.APPLICATION_JSON).get();
        int status = response.getStatus();
        List<MyEntity> myEntities = response.readEntity(new GenericType<List<MyEntity>>() {});

        //Perform some tests on the data
    }
}