2014-02-27 2 views
0

DB에 실제로 데이터가 삽입되는지 확인하기 위해 몇 가지 방법을 테스트하고 싶습니다. 저는 play framework 2.2.1을 사용 중이며 H2 인 메모리 DB를 사용하고 있습니다. 로드 쿼리를 테스트하기 위해 초기 데이터가있는 SQL 스크립트를로드하는 응용 프로그램 데이터베이스를 부트 스트랩하고 있습니다.데이터베이스에 JPA 삽입 단위 테스트하기

나는 JPAEntityManager이되도록 확장하고있는 AbstractTest을 작성했습니다.

public abstract class AbstractTest { 
    protected EntityManager em; 

    @Before 
    public void setUp() { 
     FakeApplication app = Helpers.fakeApplication(); 
     Helpers.start(app); 
     Option<JPAPlugin> jpaPlugin = app.getWrappedApplication().plugin(JPAPlugin.class); 
     em = jpaPlugin.get().em("default"); 
     JPA.bindForCurrentThread(em); 
    } 

    @After 
    public void tearDown() { 
     JPA.bindForCurrentThread(null); 
     em.close(); 
    } 
} 

이 클래스를 사용하면로드 쿼리를 쉽게 테스트 할 수 있습니다.

JPATransaction이 테스트가 끝날 때 닫히기 때문에 DB에 저장하는 방법을 테스트 할 수 없습니다. 방금 DB에 저장 한 객체를로드하려고하면 null.

public class MessageServiceTest extends AbstractTest { 

    public void saveTest(){ 
     User user = User.findById(2L, User.class); 
     Interlocutor interlocutor = Interlocutor.findById(1L, Interlocutor.class); 
     Conversation conversation = new Conversation(); 
     conversation.user = user; 
     conversation.interlocutor = interlocutor; 
     conversation.save(); 

     //I know the id of the saved object is 2 
     Conversation conversantionFromDb = Conversation.findById(2L, Conversation.class); 
     assertThat(conversantionFromDb.id).isEqualTo(2); 
     //Null pointer the conversation object is not saved to the DB. 
    } 
} 

내가 뭔가를 누락 : 예를 들어

? DB에 데이터 삽입을 테스트하는 가장 좋은 방법은 무엇입니까?

+0

저장된 개체의 ID가 2임을 어떻게 알 수 있습니까? conversation.getId()를 사용하여 실제 생성 된 대화 ID를 사용하지 않는 이유는 무엇입니까? –

+0

@JBNizet 예'id '를 사용할 수는 있지만 객체가 DB에 저장 될 때까지는 null이고 변환의 끝에서 발생하는 것은 테스트의 끝입니다. – Atropo

+0

ID 생성과 삽입을 강제로 데이터베이스에 적용하는 em.flush()를 호출합니다. –

답변

0

해결책을 찾았 으면 Transaction을 열고 닫아야합니다. 수정 된 AbstractTest 클래스 :

public abstract class AbstractTest { 
    protected EntityManager em; 

    @Before 
    public void setUp() { 
     FakeApplication app = Helpers.fakeApplication(); 
     Helpers.start(app); 
     Option<JPAPlugin> jpaPlugin = app.getWrappedApplication().plugin(JPAPlugin.class); 
     em = jpaPlugin.get().em("default"); 
     JPA.bindForCurrentThread(em); 
     em.getTransaction().begin(); 
    } 

    @After 
    public void tearDown() { 
     em.getTransaction().commit(); 
     JPA.bindForCurrentThread(null); 
     em.close(); 
    } 
} 
관련 문제