2013-08-21 113 views
3

我有一組類可以在項目中使用REST方法。他們是這樣的:如何使用Arquillian測試RESTful方法?

@Path("customer/") 
@RequestScoped 
public class CustomerCollectionResource { 

    @EJB 
    private AppManager manager; // working with DB 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response list(@QueryParam("email") String email) { 
     final List<Customer> entities = manager.listCustomers(email); 
     // adding customers to result 
     return Response.ok(result).build(); 
    } 
} 

,我已經寫了測試方法後:

@RunWith(Arquillian.class) 
public class CustomerResourceTest { 

@Deployment 
public static WebArchive createTestArchive() { 
     return ShrinkWrap.create(WebArchive.class, "test.war") 
     // Adding omitted         
     //.addClasses(....)     
    } 

    @Test @GET @Path("projectName/customer") @Consumes(MediaType.APPLICATION_JSON) 
    public void test(ClientResponse<List<Customer>> response) throws Exception { 
    assertEquals(Status.OK.getStatusCode(), response.getStatus());  
    } 
} 

,並試圖運行這個測試時,我得到NullPointerException異常。這是因爲在測試案例中空洞的迴應。爲什麼發生這種情況?數據庫配置正確。

回答

8

arquillian測試可以運行兩種模式:容器內和客戶端模式。 HTTP接口只能在客戶端模式下測試(從來沒有嘗試過擴展,只使用了香草Arquillian)。

默認情況下,由arquillian測試運行器servlet調用的容器上下文中執行的測試方法。

@RunWith(Arquillian.class) 
public class CustomerResourceTest { 

    @EJB SomeBean bean; // EJBs can be injected, also CDI beans, 
         // PersistenceContext, etc 

    @Deployment 
    public static WebArchive createTestArchive() { 
     return ShrinkWrap.create(WebArchive.class, "test.war") 
     // Adding omitted         
     //.addClasses(....)     
    } 

    @Test 
    public void some_test() { 
     bean.checkSomething(); 
    } 
} 

在客戶端模式下,測試方法是運行在容器外,因此您不必訪問的EJB的,但EntityManager等注入測試類,但你可以爲檢測注入的URL參數方法。

@RunWith(Arquillian.class) 
public class CustomerResourceTest { 

    // testable = false here means all the tests are running outside of the container 
    @Deployment(testable = false) 
    public static WebArchive createTestArchive() { 
     return ShrinkWrap.create(WebArchive.class, "test.war") 
     // Adding omitted         
     //.addClasses(....)     
    } 

    // baseURI is the applications baseURI. 
    @Test 
    public void create_account_validation_test (@ArquillianResource URL baseURI) { 
    } 

您可以使用此URL參數來構建網址中使用您有任何方法,如新的JAX-RS客戶端API調用你的HTTP服務。

您也可以混合使用這兩種模式:

@RunWith(Arquillian.class) 
public class CustomerResourceTest { 

    @EJB SomeBean bean; 

    @Deployment 
    public static WebArchive createTestArchive() { 
     return ShrinkWrap.create(WebArchive.class, "test.war") 
    } 

    @Test 
    @InSequence(0) 
    public void some_test() { 
     bean.checkSomething(); 
    } 

    @Test 
    @RunAsClient // <-- this makes the test method run in client mode 
    @InSequence(1) 
    public void test_from_client_side() { 
    } 
} 

這是有時甚至是必要的,因爲一些擴展,如持久性可以在客戶端模式無法運行。

相關問題