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注释以声明方式配置事务提交和回滚行为

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#integration-testing-annotations

@Commit表示应在测试方法完成后提交事务测试方法的事务。 @Commit可以用作@Rollback的直接替换(false),以便更明确地传达代码的意图。

我同意拉尔夫的回答。

Propagation.REQUIRES_NEW创建一个新事务,这可能与运行测试的主事务路由不匹配。

在我的简单经验中,注释@Transactional将正确地工作以定义每个单独测试应该运行的事务上下文,将特定的当前Rollback子句委托给此一个(如Ralph所示)。

拉尔夫的答案很有用,同时Snicolas的答案涉及管理测试环境的特定情况。 幂等性是集成和自动测试的基础,但应该是实现它们的不同方法。 问题是,你有哪种方法? 那些方法有什么样的行为?

  [...] @Transactional public class Test { @Test @Rollback(false) public void test() { [...] 

简单,问题连贯的方式:)