2016-03-02 91 views
1

我使用JAX-RS編寫了一個REST Web服務,該服務對我選擇的特定JAX-RS實現一無所知。我碰巧使用了TomEE,這意味着我的JAX-RS實現是ApacheCXF。是否有可能編寫與您的JAX-RS實現無關的JUnit測試?

我想爲Web服務編寫單元測試,它對JAX-RS的實現一無所知。這可能嗎?到目前爲止,我發現的每個示例都涉及使用來自特定JAX-RS實現的類(JAXRSClientFactory for ApacheCXF,Jersey Test Framework等)。

我已經開始嘗試使用tomee嵌入式,並且能夠測試我的EJB,但它似乎沒有啓動REST服務。

回答

1

我的解決方案是使用Arquillian與嵌入式TomEE配對。 Arquillian提供了大量的功能,但我只是用它來啓動/停止嵌入式TomEE。因此,所有我需要做的是加入到我的pom.xml:

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

然後,我可以寫一個JUnit測試一點點額外的Arquillian的東西,純JAX-RS:

@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 
    } 
} 
相關問題