2013-08-21 5 views
3

У меня есть набор классов для работы с методами REST в проекте. Они выглядят так:Как проверить методы RESTful с Arquillian?

@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 настроена правильно.

ответ

8

Существует два режима, в которых может выполняться тест arquillian: внутриконтейнерный и клиентский. 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(); 
    } 
} 

В режиме клиента, методы испытаний работают вне контейнера, так что вы не имеете доступа к EJBs, 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-адресов для вызова службы HTTP с помощью какой бы метод вы имеете, как новый клиентский API JAX-RS.

Вы можете также смешать два режима:

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

Это иногда даже необходимо, потому что некоторые расширения, как настойчивость, не может работать в режиме клиента.

Смежные вопросы