2012-04-12 8 views
2

Spring과 JUnit을 사용하여 DAO에 대한 통합 테스트를 작성합니다. 테스트 메소드의 시작 부분에 테스트 데이터를 설정 한 다음 나중에 동일한 테스트 메소드에서 DAO 메소드를 테스트합니다. 문제는 트랜잭션을 플러시/커밋하지 않으면 EntityManager가 데이터 설정에서 방금 만든 엔티티 인스턴스를 반환한다는 것입니다. 테스트가 쓸모 없으므로 항상 통과하게됩니다.단위 테스트 중 트랜잭션을 커밋/플러시합니까?

예.

@Test 
@Transactional() 
public void loadTreeBasicCase() { 
    // creates and saved node to DB 
    Node n = createNode(); 

    // test DAO 
    Node result = dao.lookup(n.getId()); 

    // verify 
    assertThat(n, equalTo(result)); 
} 

한 가지 방법은 내 DAO에서 commit() 및/또는 flush() 메소드를 노출하는 것입니다. 하지만 프로덕션 코드에서는이 작업을 거의 수행 할 필요가 없으므로 (EntityManager로 작업하게하는) 작업을 수행하지 않으려합니다. 주석이나 Spring 설정을 통해 이것을 설정하는 방법이 있습니까? 나는 Spring, JPA2 with Hibernate를 사용하고있다.

답변

2

@Transactional에 defaultRollback 특성을 설정하여 테스트간에 다시 설정할 수 있습니다. 이것은 당신이 요구하는 것과 같지 않고, 그냥 먼저 던지기 만하면됩니다.

테스트 내에서 엔티티 관리자가 올바르게 작동합니다. 테스트를 위해 다른 동작을 주입하여 나머지 테스트와 설정을 "연결 해제"하려고합니다. 한 가지 내가 테스트에서 한 것은 엔티티 관리자에서 직접 플러시를 호출하는 것이 었습니다. 나는 단지 몇 번해야만했지만, 그럴 경우 가치가있었습니다. 나는 사람들이 전화하기를 원하지 않는 DAO에 대한 방법을 제공하지 않기 위해 (DAO가 아닌) 테스트에서 그것을했다.

+0

물론 나를 상기시켜 줘서 고마워. 필자는 DAO를 통해 엔티티 관리자를 사용하는 데 너무 익숙합니다. 필자는 DAO를 호출하여 직접 테스트 할 수 있다는 사실을 잊어 버렸습니다. :) – citress