2010-07-12 4 views
0

Spring 3과 Hibernate 3.5를 사용하고 있습니다. 테스트 환경에서 트랜잭션을 롤백하지 않을 것이므로 프로덕션 환경에서 롤백되지 않을까 걱정됩니다.Spring 트랜잭션 유닛 테스트 - 최대 절전 모드 쿼리가 롤백되지 않음

테스트 클래스 :이 테스트 클래스 수를 '내가 여러 데이터 소스를 가지고 있기 때문에 인 SimpleJdbcTemplate 삽입을 할 필요가, 기본적으로 :

public abstract class AbstractTransactionalTemplateTests extends AbstractTransactionalJUnit4SpringContextTests { 

    protected SimpleJdbcTemplate simpleJdbcTemplate; 

    @Autowired 
    DashTemplateRepository dashTemplateRepository; 

    @Resource(name = "dashDataSource") 
    public void setDataSource(final DataSource dataSource) { 
     this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource); 
    } ..snip... 

UPDATE : 사용자 정의 클래스를 확장

@ContextConfiguration(loader = MyConfigurationLoader.class) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
public class DashTemplateRepositoryTest extends AbstractMulitpleDataSourceSpringContextTests { 

    @Autowired 
    DashTemplateRepository dashTemplateRepository; 

    @Test 
    public void testSaveCategory() { 
     int initialCount = getCategoryCount(); 

     Category c = new Category(); 
     c.setName("mynewcategory"); 
     dashTemplateRepository.save(c); 

     assertEquals(initialCount + 1, getCategoryCount()); 
    } 
} 

그 문제를 해결하기 위해 봄 지원 솔루션을 찾을 수 없었지만 봄 포럼에서이 해결 방법을 게시했습니다. 이 수퍼 클래스를 추출하기 전에 롤백 문제가있었습니다. 나는 문제가 그것보다 더 기본이라고 가정하고, 최대 절전 모드는 트랜잭션 관리자를 인식하지 못하는 것 같아, 내가 증명할 수있는 방법이 있는가?

데이터 소스 콩 :

<bean id="dashDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <property name="url" value="jdbc:mysql://localhost:3306/dashtemplate"/> 
     <property name="username" .../> 
     <property name="password" .../> 
    </bean> 

내 상황에 text.xml 시험은 잘 실행

<!-- Hibernate --> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dashDataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>com.dash.Category</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="dashTemplateRepository" class="com.wdp.DashTemplateRepositoryHibernateTemplateImpl"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

, 내 객체가 유지됩니다 (간체, 그것의 일부를 왼쪽), 그러나 그것은 결코 롤백하면 아무런 오류도 나타나지 않습니다

+0

무엇'DashTemplateRepositoryHibernateTemplateImpl' 생겼 지원하지 않습니다? – skaffman

+0

롤백해야하는 이유는 무엇입니까? – Bozho

+0

@Bozho :'@ TransactionConfiguration'의'defaultRollback' 속성이 – skaffman

답변

6

문제는 MySQL이 대신 이노의의 MyISAM을 사용하고 있었다이었다 - 롤백은의 MyISAM

2

이것은 내 기본 테스트 클래스의 모양이며 잘 작동합니다.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath*:/context.xml"}) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
@Transactional 
public class BaseTest extends AbstractTransactionalJUnit4SpringContextTests { 
//.... 
} 
+0

이 프로젝트는 여러 달 후에 다른 프로젝트에서 나에게 도움이되었습니다. 원래의 문제는 해결하지 못했습니다. – walnutmon