在@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 / @Aftercallback,最后回滚。 它默认工作,在上下文中有足够的事务pipe理器。
来自: 10.3.5.4事务pipe理 (粗体):
在TestContext框架中,事务由TransactionalTestExecutionListenerpipe理。 请注意,
TransactionalTestExecutionListener是默认configuration的 ,即使您没有在testing类中显式声明@TestExecutionListeners。 但是,为了支持事务,必须在由@ContextConfiguration语义加载的应用程序上下文中提供一个PlatformTransactionManagerbean。 另外, 您必须在类或方法级别为testing声明@Transactional。
旁白:试图修改托马斯·努尔凯维奇的答案被拒绝了:
这种编辑不会使文章更容易阅读,更容易find,更准确或更易于阅读。 更改要么完全是多余的,要么主动损害可读性。
正确和永久地链接到集成testing的相关文档部分。
要启用对事务的支持,您必须在通过
@ContextConfiguration语义加载的ApplicationContext中configuration一个PlatformTransactionManagerbean。
@组态
@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(); } }