2011-02-24 29 views
3

どういうわけか、私のテストでは、Springテストを実行しているときに、削除トランザクションがロールバックされていません。データは完全に削除されます。 私はSpring-Hibernateコンボを使用しています。トランザクションがSpringでロールバックされない削除操作のテスト

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({TransactionalTestExecutionListener.class, 
DependencyInjectionTestExecutionListener.class 
}) 
@ContextConfiguration(locations={"/testApplicationContext.xml"}) 
@TransactionConfiguration(defaultRollback=true) 
public class TestDummy { 

private ApplicationContext context; 

@Transactional 
private AccountManager getAccountManager() { 
    this.context = new ClassPathXmlApplicationContext("testApplicationContext.xml"); 
    return (AccountManager) context.getBean("accountManager"); 
} 



@Test 
@Transactional 
@Rollback(true) 
public void testDeleteAccount(){ 

     Account acc = getAccountManager().getAccountDaoHibernate().get("87EDA29EBB65371CE04500144F54AB6D"); 
     System.out.println("Account name is "+acc.getAccountName()); 
     getAccountManager().deleteAccountHard(acc); 
     Account acc1 = getAccountManager().getAccountDaoHibernate().get("87EDA29EBB65371CE04500144F54AB6D"); 
     if(acc1 != null){ 
     System.out.println("Now name is "+ acc1.getAccountName()); 
     }else{ 
      System.out.println("Account again is null"); 
     } 

    } 
} 

私はコンソールにメッセージを見ることができる「アカウント再びヌルである」それがあるべき:

はここに私のテストクラスです。そのテストと同様に。しかし、テストが終わった後。データベースでは、ID「87EDA29EBB65371CE04500144F54AB6D」のレコードは永久に削除されます。テストが完了した後、ロールバックする必要があります。なぜトランザクションがロールバックしていないのか、私は本当に混乱しています。

 <bean id="accountManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
      <property name="target"><ref local="accountManagerTarget"/></property> 
      <property name="transactionManager"><ref local="transactionManager"/></property> 
        <property name="transactionAttributes"> 
        <props> 
          <!-- Avoid PROPAGATION_REQUIRED !! It could kill your performances by generating a new transaction on each request !! --> 

          <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop> 
          <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> 
          <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> 
          <prop key="add*">PROPAGATION_REQUIRED</prop> 
          <prop key="del*">PROPAGATION_REQUIRED</prop> 

        </props> 
      </property> 
      <property name="preInterceptors"> 
       <list> 
        <ref bean="hibernateInterceptor"/> 
       </list> 
      </property>   

    </bean> 


<bean id="accountManagerTarget" 
      class="com.db.spgit.abstrack.manager.AccountManager"> 
    <property name="accountDaoHibernate" ref="accountDaoHibernate" /> 
</bean> 


<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="configurationClass"> 
     <value>org.hibernate.cfg.AnnotationConfiguration</value> 
    </property> 
    <property name="configLocation"> 
     <value>classpath:hibernate-test.cfg.xml</value> 
    </property> 
</bean> 

<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor"> 
    <property name="sessionFactory">  
     <ref bean="sessionFactory"/> 
    </property> 
</bean> 


<bean id="hibernateTemplate" 
    class="org.springframework.orm.hibernate3.HibernateTemplate"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

答えて

4

あなたのテストは絶対に奇妙に見える:

は、ここに私のtestApplicationContext.xmlエントリです。 @ContextConfigurationは既にアプリケーションコンテキストをロードしているため、手動で行う必要はありません。

次のコードは期待通りに動作するはずです:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"/testApplicationContext.xml"}) 
@TransactionConfiguration(defaultRollback=true) 
public class TestDummy { 
    @Autowired 
    private AccountManager accountManager; 

    @Test 
    @Transactional 
    public void testDeleteAccount(){   
     Account acc = accountManager.getAccountDaoHibernate().get("87EDA29EBB65371CE04500144F54AB6D"); 
     System.out.println("Account name is "+acc.getAccountName()); 
     accountManager.deleteAccountHard(acc); 
     Account acc1 = accountManager.getAccountDaoHibernate().get("87EDA29EBB65371CE04500144F54AB6D"); 
     if(acc1 != null){ 
      System.out.println("Now name is "+ acc1.getAccountName()); 
     }else{ 
      System.out.println("Account again is null"); 
     }   
    } 
} 

も参照してください:

+0

パーフェクト!それが原因でした。削除は現在ロールバックされています。 – supernova

+0

プロキシのtestApplicationContext.xmlエントリは理想的に設定されていますか?彼らはうまくいっていますが、私はまだプロキシ/インターセプターを設定するより良い方法があるはずだと思います。 – supernova

+0

@supernova:私は注釈主導のアプローチが好きなので、インターセプタの手動設定にはあまり慣れていません。 – axtavt

関連する問題