在@Test之后回滚事务
首先,我在StackOverflow上发现了很多关于这个的线程,但是他们没有一个真的帮助我,所以很抱歉要问可能重复的问题。
我使用spring-test运行JUnittesting,我的代码看起来像这样
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {}) public class StudentSystemTest { @Autowired private StudentSystem studentSystem; @Before public void initTest() { // set up the database, create basic structure for testing } @Test public void test1() { } ... }
我的问题是,我想我的testing不影响其他testing。 所以我想为每个testing创build一些回滚。 我为此搜寻了很多,但到目前为止我还没有发现任何东西。 我为此使用Hibernate和MySql
只需在testing之上添加@Transactional
注释:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"testContext.xml"}) @Transactional public class StudentSystemTest {
默认情况下,Spring将启动围绕您的testing方法的新事务和@Before
/ @After
callback,最后回滚。 它默认工作,在上下文中有足够的事务pipe理器。
来自: 10.3.5.4事务pipe理 (粗体):
在TestContext框架中,事务由TransactionalTestExecutionListenerpipe理。 请注意,
TransactionalTestExecutionListener
是默认configuration的 ,即使您没有在testing类中显式声明@TestExecutionListeners
。 但是,为了支持事务,必须在由@ContextConfiguration
语义加载的应用程序上下文中提供一个PlatformTransactionManager
bean。 另外, 您必须在类或方法级别为testing声明@Transactional
。
旁白:试图修改托马斯·努尔凯维奇的答案被拒绝了:
这种编辑不会使文章更容易阅读,更容易find,更准确或更易于阅读。 更改要么完全是多余的,要么主动损害可读性。
正确和永久地链接到集成testing的相关文档部分。
要启用对事务的支持,您必须在通过
@ContextConfiguration
语义加载的ApplicationContext
中configuration一个PlatformTransactionManager
bean。
@组态 @PropertySource( “application.properties”) 公共类持久{ @Autowired 环境环境 @豆 DataSource的dataSource(){ 返回新的DriverManagerDataSource( env.getProperty( “datasource.url”), env.getProperty( “datasource.user”), env.getProperty( “datasource.password”) ); } @豆 PlatformTransactionManager transactionManager(){ 返回新的DataSourceTransactionManager(dataSource()); } }
另外,您必须在类或方法级别为testing声明Spring的
@Transactional
注释。
@RunWith(SpringJUnit4ClassRunner.class)来 @ContextConfiguration(classes = {Persistence.class,SomeRepository.class}) @Transactional 公共类SomeRepositoryTest {...}
使用
@Transactional
注释一个testing方法会导致testing在事务中运行,默认情况下会在testing完成后自动回滚。 如果一个testing类用@Transactional
注解,则该类层次结构中的每个testing方法将在一个事务中运行。
提到添加@Transactional
的答案是正确的,但为了简单起见,您可以让testing类extends AbstractTransactionalJUnit4SpringContextTests
。
我知道,我太迟了,不能发表一个答案,但希望这可能有助于某人。 另外,我刚刚解决了我的testing问题。 这是我在testing中的:
我的testingclass
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "path-to-context" }) @Transactional public class MyIntegrationTest
上下文xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean>
我仍然有问题,数据库没有被自动清理。
当我将以下属性添加到BasicDataSource时问题已解决
<property name="defaultAutoCommit" value="false" />
希望能帮助到你。
您需要使用sprint环境和事务pipe理器来运行testing,例如,
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"/your-applicationContext.xml"}) @TransactionConfiguration(transactionManager="txMgr") public class StudentSystemTest { @Test public void testTransactionalService() { // test transactional service } @Test @Transactional public void testNonTransactionalService() { // test non-transactional service } }
有关更多详细信息,请参阅第10. Testing
章Spring 10. Testing
。
您可以禁用回滚:
@TransactionConfiguration(defaultRollback = false)
例:
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @Transactional @TransactionConfiguration(defaultRollback = false) public class Test { @PersistenceContext private EntityManager em; @org.junit.Test public void menge() { PersistentObject object = new PersistentObject(); em.persist(object); em.flush(); } }