0
DB에 실제로 데이터가 삽입되는지 확인하기 위해 몇 가지 방법을 테스트하고 싶습니다. 저는 play framework 2.2.1
을 사용 중이며 H2
인 메모리 DB를 사용하고 있습니다. 로드 쿼리를 테스트하기 위해 초기 데이터가있는 SQL
스크립트를로드하는 응용 프로그램 데이터베이스를 부트 스트랩하고 있습니다.데이터베이스에 JPA 삽입 단위 테스트하기
나는 JPA
EntityManager
이되도록 확장하고있는 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();
}
}
이 클래스를 사용하면로드 쿼리를 쉽게 테스트 할 수 있습니다.
JPA
Transaction
이 테스트가 끝날 때 닫히기 때문에 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에 데이터 삽입을 테스트하는 가장 좋은 방법은 무엇입니까?
저장된 개체의 ID가 2임을 어떻게 알 수 있습니까? conversation.getId()를 사용하여 실제 생성 된 대화 ID를 사용하지 않는 이유는 무엇입니까? –
@JBNizet 예'id '를 사용할 수는 있지만 객체가 DB에 저장 될 때까지는 null이고 변환의 끝에서 발생하는 것은 테스트의 끝입니다. – Atropo
ID 생성과 삽입을 강제로 데이터베이스에 적용하는 em.flush()를 호출합니다. –