2014-06-30 3 views
1

현재 작성한 일부 REST 전체 서비스에 대한 테스트를 작성하고 있습니다. 내가 테스트하는 서비스는 Java로 작성되어 MongoDb/Morphia를 사용합니다. 테스트는 서비스를 호출하고 일부는 테스트 콜렉션에 기록합니다. 검사를 끝내고 주사 한 데이터를 삭제해야합니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 여기 Arquillian 테스트 중 데이터베이스 살생

내 간단한 서비스 중 하나의 예입니다

package org.haib.myerslab.services; 

@Path("/database") 
public class DatabaseService { 
    @Inject 
    private Datastore ds; 

    @Path("/genre/") 
    @POST 
    @Produces("application/json") 
    public GenreDTO postFromGenreDTO(@Context UriInfo uri, GenreDTO form) throws ParseException { 
     Genre myNewGenre = DtoToDomainMapper.gerneFromGenreDTO(form); 
     myNewGenre.setId(form.getId()); 
     ds.save(myNewGenre); 
     return new GenreDTO(myNewGenre); 
    } 
}  

을 그리고 여기 내 Arquillian 테스트의 예입니다

다음 getDeployment 기능은 다음과 같습니다 어디

@RunWith(Arquillian.class) 
public class GeneTest { 
    private static String myId = "myGenreId"; 
    private static String myGenre = "myGenre"; 
    private static String myGenreInfo = "myGenreInfo"; 

    @Deployment 
    public static WebArchive getDeployment() { 
     return TestHelper.getDeployment(); 
    } 

    @Test 
    @RunAsClient 
    @InSequence(1) 
    public void canPostGenre(@ArquillianResource URL baseURL) throws Exception { 
     GenreDTO newGenre = new GenreDTO(); 
     newGenre.setGenre(myGenre); 
     newGenre.setGenreInfo(myGenreInfo); 
     newGenre.setId(myId); 

     String url = baseURL.toURI().resolve("/database/genre/").toString(); 
     JsonNode rootNode = TestHelper.postUrl(url, newGene); 

     assertEquals(myGenre,  rootNode.get("genre").asText()); 
     assertEquals(myGenreInfo, rootNode.get("genreInfo").asText()); 
     assertEquals(myId,  rootNode.get("id").asText()); 
    } 
} 

public static WebArchive getDeployment() { 
    File[] depend = Maven.resolver().loadPomFromFile("pom.xml").importRuntimeDependencies().resolve().withTransitivity().asFile(); 
    WebArchive war = ShrinkWrap.create(WebArchive.class).addClass(TestHelper.class) 
     .addClass(Genre.class).addClass(Application.class).addPackage("org/haib/myerslab") 
     .addPackage("org/haib/myerslab/database").addPackage("org/haib/myerslab/genre") 
     .addPackage("org/haib/myerslab/dto").addPackage("org/haib/myerslab/dto/genre") 
     .addAsLibraries(depend).addAsWebInfResource("jboss-deployment-structure.xml") 
     .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml").setWebXML("test-web.xml"); 
    return war; 
} 

내가 잃어버린 곳에서, @After에서 데이터베이스를 삽입하는 가장 좋은 방법은 무엇입니까, 우리의 장르 클라스를 정리하면, 다음 장의 테스트에는 거기에 없다. 어떻게해야합니까? 다른 방법이 있습니까?

+0

+1 좋은 점은 누군가가 통합 테스트를위한 우수 사례를 찾고 있다는 것입니다. –

답변

2

nosql-unit을 살펴보십시오. 여기에는 데이터 집합 시드, 기대치 비교 및 ​​MongoDB 정리에 도움이되는 주석과 규칙이 있습니다.

테스트를 실행하기 전에 깨끗한 상태로 MongoDB를 얻으려면, 당신은 단순히`CLEAN_INSERT'에 다음과 같은 주석을 사용할 수 있습니다

@UsingDataSet(locations="my_data_set.json", loadStrategy=LoadStrategyEnum.CLEAN_INSERT) 
public void canPostGenre() { ...} 

당신이 MongoDB를 함께 통합 테스트 라이프 사이클에 주위에 동작을해야하는 경우 좀 더 강력 해지면 nosql-unit의 아이디어를 토대로 자신 만의 롤백을 할 수 있습니다. 또한 Junit Rules을 확인하십시오.

관련 문제