2013-04-08 3 views
0

스프링 테스트와 H2 메모리 데이터베이스를 사용하여 일련의 통합 테스트를 수행했습니다. 나는 h2 데이터베이스가 모든 테스트 후에 롤백되지 않는다는 것을 알아 챘다.테스트 후 스프링 테스트가 롤백되지 않습니다.

@RunWith(SpringJUnit4ClassRunner.class) 
public class BlaServiceIntegrationTest extends AbstractTest { 

@Autowired 
private BlaService blaService; 

@Test() 
public void doBla() { 
    // some other test that writes in the database 
} 

@Test() 
public void saveNewBla() { 
    assertEquals(0, findAllBlas().size()); // <-- fails, the db is not empty. 
      // the previous test did not roll back 
} 

는 그 다음 AbstractTest가 :

내 설정이다

@ContextConfiguration(locations = { "classpath:test-with-db.xml" }) 
@TransactionConfiguration(defaultRollback = true) 
@Transactional() 
public class AbstractTest { 


private static final Logger LOG = LoggerFactory.getLogger(AbstractTest.class); 

@Autowired 
protected SessionFactory sessionFactory; 


public AbstractTest() { 
    super(); 
} 

@SuppressWarnings("unchecked") 
protected List<Bla> findAllBlas() { 
    return sessionFactory.getCurrentSession().createCriteria(Bla.class).list(); 
} 

봄의 설정 :

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource " 
    p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" 
    p:username="${jdbc.username}" p:password="${jdbc.password}"> 
</bean> 

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"></property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl}</prop> 
      <!-- <prop key="hibernate.use_sql_comments">false</prop> --> 

     </props> 
    </property> 
    <property name="packagesToScan" value="com.company.bla.back.domain"></property> 
</bean> 


<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
    p:sessionFactory-ref="sessionFactory"> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

<bean id="hibernateConfiguration" factory-bean="&amp;sessionFactory" 
    factory-method="getConfiguration" /> 

그리고 테스트에 특정 config.properties :

################### MySQL JDBC Configuration ################## 
jdbc.driverClassName=org.h2.Driver 
jdbc.url=jdbc:h2:mem;DB_CLOSE_ON_EXIT=FALSE 
jdbc.username= 
jdbc.password= 

################### Hibernate Configuration ########################## 
hibernate.dialect=org.hibernate.dialect.H2Dialect 
hibernate.show_sql=false 
hibernate.hbm2ddl=create-drop 
hibernate.generate_statistics=false 

그리고 서비스가 테스트되고 :

@Service("blaService") 
@Transactional(propagation = Propagation.MANDATORY) 
public class BlaServiceImpl implements BlaService { 

답변

0

신경 쓰지 마, 나는 해결책을 찾아 냈다. 전혀 롤백 문제가 아니 었나요? findAllBla() 메소드에서 실수가 있었습니까? 필요한 항목 :

.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 
관련 문제