繁体   English   中英

春季测试事务注释不起作用

[英]Spring Test Transactional annotation not working

我在使测试与事务支持一起运行时遇到问题。

这是一种重现方法:

import org.junit.Test;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.transaction.support.TransactionSynchronizationManager;

import javax.transaction.SystemException;

@ContextConfiguration("classpath:applicationContext-hibernate-test.xml")
public class TransactionsTest extends AbstractTransactionalJUnit4SpringContextTests {

  @Transactional
  @Test
  public void testTransactionEnabled() throws SystemException {
    assert TransactionSynchronizationManager.isActualTransactionActive(); // works
    assert ! TransactionSynchronizationManager.isCurrentTransactionReadOnly(); // works
    assert TransactionAspectSupport.currentTransactionStatus() != null; // fails
  }
}

将产生:

  • testTransactionEnabled在标记的行中失败

尽管Springs文档明确说明了使用@Transactional注释的测试将导致测试在事务内运行:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#testcontext-tx-enabling-transactions

我的applicationContext-hibernate-test.xml:

<beans...>
  <jdbc:embedded-database id="dataSource" type="H2" />
  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >...
  </bean>

  <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
    </property>
  </bean>

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

</beans>

相关问题: https//stackoverflow.com/questions/943095

编辑:日志显示:

2016-01-08 15:38:31,832 DEBUG [org.springframework.orm.jpa.JpaTransactionManager:367] - Creating new transaction with name ...

因此,我认为确实创建了一个事务,但是无法通过TransactionAspectSupport.currentTransactionStatus()读取其状态,因为Spring只会读取@Transactional批注,而不会检测测试方法,因此不会在TransactionAspectSupport绑定/取消绑定TransactionAspectSupport 如果是这样,我认为这可能是一个错误或至少是一个理想的功能。

因此,我认为永远不要使用TransactionAspectSupport.currentTransactionStatus()。 代替:

    TransactionSynchronizationManager.isActualTransactionActive();
    TransactionSynchronizationManager.isCurrentTransactionReadOnly();

应该使用(在测试和代码中),因为TransactionAspectSupport实际上仅适用于带有@Transactional注释的bean,不能用于带有该注释的测试,也没有其他使用事务的方式。

因此,对Spring的一个更好的建议是不建议使用公共方法TransactionAspectSupport.currentTransactionStatus(),因为它容易出错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM