3

プロジェクトでRESTメソッドを操作する一連のクラスがあります。それらは次のようになります。

@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 が発生します。テストケースの空の応答が原因です。なぜこれが起こるのですか?DB が適切に構成されている。

4

1 に答える 1

8

arquillian テストを実行できるモードには、コンテナ内モードとクライアント モードの 2 つがあります。HTTP インターフェイスはクライアント モードでのみテストできます (拡張機能を試したことはなく、バニラの Arquillian のみを使用しました)。

デフォルトでは、コンテナーのコンテキストで実行されるテスト メソッドは、arquillian テスト ランナー サーブレットによって呼び出されます。

@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 パラメーターを使用して URL を作成し、新しい JAX-RS クライアント API など、任意のメソッドを使用して HTTP サービスを呼び出すことができます。

2 つのモードを混在させることもできます。

@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() {
    }
}

持続性などの一部の拡張機能はクライアント モードで実行できないため、これが必要になることもあります。

于 2013-08-22T15:53:16.220 に答える