2010-03-04 7 views
3

AbstractTransactionalJUnit4SpringContextTests 기본 클래스를 사용하여 통합 테스트를 설정하려고합니다. 내 목표는 간단합니다 : simpleJdbcTemplate을 사용하여 데이터베이스에 데이터를 삽입하고, DAO를 사용하여 데이터를 다시 읽은 다음 다시 롤백합니다. JPA -> Hibernate는 영속 계층이다.AbstractTransactionalJUnit4SpringContextTests : 삽입 된 데이터를 찾기 위해 DAO를 가져올 수 없습니다.

제 테스트를 위해 외래 키가없는 버전의 데이터베이스를 만들었습니다. 이렇게하면 각 테스트의 조명기 설치량을 줄여서 테스트 속도를 높일 수 있습니다. 이 단계에서는 DB 무결성을 테스트하는 데 관심이 없으며 HQL의 비즈니스 로직 만 테스트합니다.

/* DAO */ 

@Transactional 
@Repository("gearDao") 
public class GearDaoImpl implements GearDao { 
    @PersistenceContext 
    private EntityManager entityManager; 

    /* Properties go here */ 

    public Gear findById(Long id) { 
     return entityManager.find(Gear.class, id); 
    } 
} 

/* Test Page */ 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"/com/dom/app/dao/DaoTests-context.xml"}) 
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=false) 
public class GearDaoImplTests extends AbstractTransactionalJUnit4SpringContextTests { 

    @Autowired 
    private GearDao gearDao; 

    @Test 
    @Rollback(true) 
    public void quickTest() { 
     String sql; 
     // fields renamed to protect the innocent :-) 
     sql = "INSERT INTO Gear (Gear_Id, fld2, fld3, fld4, fld5, fld6, fld7) " + 
       " VALUES (?,?,?,?,?,?,?)"; 
     simpleJdbcTemplate.update(sql, 1L, 1L, 1L, "fld4", "fld5", new Date(), "fld7"); 
     assertEquals(1L, simpleJdbcTemplate.queryForLong("select Gear_Id from Gear where Gear_Id = 1")); 
     System.out.println(gearDao); 

     Gear gear = gearDao.findById(1L); 
     assertNotNull("gear is null.", gear); // <== This fails. 
    } 
} 

응용 프로그램 (스프링 MVC 사이트)은 DAO와 잘 작동합니다. 무슨 일이 일어날 수 있니? 그리고 내가 어디에서 해결책을 찾기 시작할 것인가?

  1. DAO를 어떻게 든 인 SimpleJdbcTemplate는 다른 데이터 소스를 가지고있다. DaoTests-context.xml 파일에 하나의 dataSource가 정의되어 있기 때문에 어떻게 될지 모르겠습니다.
  2. Hibernate는 Gear 객체를 선택하기 위해 모든 외래 키 관계가 존재해야한다. fld2/fld3/fld4에서 하드 코딩하고 있기 때문에 존재하지 않는 몇 가지 조인이 있습니다.
  3. DAO는 커밋되지 않은 데이터에 대해 작동하지 않습니다.하지만 왜 simpleJdbcTemplate이 이것을 존중합니까? 둘 다 똑같은 일을한다고 가정합니다.
  4. 팬티 놈들.하지만 이익은 어디입니까?
+0

이 게시물은 영감을 줄 수도 있습니다. http://stackoverflow.com/questions/3891624/migrating-junit-jpa-tests-from-spring-2-5-5-to-spring-3-0-4 – hoymkot

답변

2

몇 시간의 수면 시간에는 어떤 차이가 있습니다. 나는 깨어났다. "로그가 실제로 어떤 쿼리가 실행되고 있는지 확인해야한다." 물론, 하이버 네이트는 몇몇 외래 키에 대해 내부 조인을 생성하도록 구성되었다. 일단 그 의존성을 제공하면 그것은 매력처럼 작동했습니다.

모든 테스트 개념에서 자동 롤백을 좋아합니다. 통합 테스트, 여기 와서!

관련 문제