2009-08-11 5 views
0

준비된 메모리 데이터베이스없이 데이터베이스를 테스트하는 올바른 방법이 확실하지 않습니다. 나는 JUnit4를위한 TestSuite를 가지고있다.Unit-Testing PersistenceLayer (JPA/EclipseLink)

응용 프로그램이 컨테이너가 아니라 Eclipse RCP로 실행되기 때문에 JpaManager는 무시됩니다. Spring은 아직 사용되지 않았으므로 EntityManager- 참조를 삽입 할 수 없으며 수동으로 처리해야합니다. . 내가 진짜 데이터베이스에서 실행하고 있기 때문에

public class CustomerJpaTest { 

    private Customer testCustomer; 

    @Before 
    public void setUp() throws Exception { 
     JpaManager.getInstance().begin(); 
     // create a new user for testing 
     CustomerJpaDao dao = new CustomerJpaDao(); 
     testCustomer = new Customer(); 
     testCustomer.setName("Someone"); 
     dao.persist(testCustomer); 
     JpaManager.getInstance().commit(); 
    } 

    @After 
    public void tearDown() throws Exception { 
     // remove previously created user 
     CustomerJpaDao dao = new CustomerJpaDao(); 
     dao.remove(testCustomer); 
     JpaManager.getInstance().commit(); 
     JpaManager.getInstance().dispose(); 
    } 

    @Test 
    public void testCustomerSaving() throws Exception { 
     // not sure yet 
    } 

    @Test 
    public void testCustomerLoading() throws Exception { 
     ICustomerDao dao = new CustomerJpaDao(); 
     Customer customer = dao.findByName("Someone"); 
     assertEquals("Someone", customer.getName()); 
    } 
} 

, 내가 설정 방법에 테스트 완료 테스트 (들) 후 제거하기 위하여려고하고 내 객체를 생성하고있다. 정확하게 여기 내 문제 :이 setUp 및 tearDown 실제로 일종의 테스트 (testCustomerSaving, testCustomerDelete) 수 있지만 특정 순서로 실행되는 테스트가있을 때 그들은 격리되지 않을 (저장 실패하면로드 실패 뿐만 아니라 삭제).

어떻게해야할까요?

답변

2

setUp에서 트랜잭션을 시작하고 tearDown에서 트랜잭션을 롤백하십시오.

+0

이것이 실제로 시작되어 처리되는 것입니다. 하지만 실제로 db를로드 할 수있게 저장 한 후에 커밋을하고 있기 때문에 롤백은 객체를 삭제하지 않습니다. 아마 이것은 잘못된 길일 것입니다. 차이가 없다고 가정하고 JPA 캐시에서 oject가로드 된 경우 테스트로 충분합니까? – lostiniceland

+1

그러면 모서리를자를 수 없습니다. 테스트 방법에서는 실제 유스 케이스/사용자 스토리에서 발생하는 순서대로 호출합니다. –

+0

동일한 트랜잭션에서 쿼리의 영구 데이터를보기 위해 커밋 할 필요가 없습니다. 삽입을 강제 실행하려면 flush() 만 있으면됩니다. 그런 다음 후속 선택은 동일한 기본 연결을 사용하는 한 해당 데이터를 볼 수 있습니다. – wrschneider

관련 문제