JUnit测试总是回滚事务
我正在运行一个简单的JUnit测试再次应用程序DAO。 问题是我总是得到:
javax.persistence.RollbackException: Transaction marked as rollbackOnly
JUnit测试是:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:com/my/app/context.xml"} @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false) @Transactional public class PerformanceTest { @Test @Transactional(propagation= Propagation.REQUIRES_NEW) @Rollback(false) public void testMsisdnCreationPerformance() { // Create a JPA entity // Persist JPA entity } }
正如您所看到的,我明确表示不会回滚此方法。
Spring JUnit是否支持始终将回滚设置为true?
提前致谢,
它应该像您期望的那样工作,但可能是您在被测试的类中打开另一个事务,或者您在某个地方有其他function/或错误。
顺便说一句,这个注释应该是有用的:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:com/my/app/context.xml"} @Transactional public class PerformanceTest { @Test @Rollback(false) public void testMsisdnCreationPerformance() { // Create a JPA entity // Persist JPA entity } }
@参见Spring参考章9.3.5.4事务管理
想要一个改变你的数据库并保持修改的测试是很奇怪的。 测试应该是正交的:没有测试取决于另一个。 此外,测试应该独立于测试顺序,甚至是幂等的 。
因此,要么想要在setUp()
方法中更改数据库并在tearDown()
方法中回滚更改,要么为了测试而在其中设置一些具有良好值的测试数据库。
也许我在这里遗漏了一些东西,但通常你不应该那样想。
只需添加注释回滚并将标志设置为false。
@Test @Rollback(false)
从官方文档:
默认情况下,测试完成后将自动回滚测试事务; 但是,可以通过@Commit和@Rollback注释以声明方式配置事务提交和回滚行为
@Commit表示应在测试方法完成后提交事务测试方法的事务。 @Commit可以用作@Rollback的直接替换(false),以便更明确地传达代码的意图。
我同意拉尔夫的回答。
Propagation.REQUIRES_NEW创建一个新事务,这可能与运行测试的主事务路由不匹配。
在我的简单经验中,注释@Transactional将正确地工作以定义每个单独测试应该运行的事务上下文,将特定的当前Rollback子句委托给此一个(如Ralph所示)。
拉尔夫的答案很有用,同时Snicolas的答案涉及管理测试环境的特定情况。 幂等性是集成和自动测试的基础,但应该是实现它们的不同方法。 问题是,你有哪种方法? 那些方法有什么样的行为?
[...] @Transactional public class Test { @Test @Rollback(false) public void test() { [...]
简单,问题连贯的方式:)