JUnit测试总是回滚事务

Jua*_*uan 27 java spring junit4

我正在运行一个简单的JUnit测试再次应用程序DAO.问题是我总是得到:

javax.persistence.RollbackException: Transaction marked as rollbackOnly
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我明确表示不会回滚此方法.

Spring JUnit是否支持始终将回滚设置为true?

提前致谢,

Ral*_*lph 53

它应该像您期望的那样工作,但可能是您在被测试的类中打开另一个事务,或者您在某处有其他功能/或错误.

顺便说一下,这个注释应该是有用的:

@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
    }
}
Run Code Online (Sandbox Code Playgroud)

@参见Spring参考章9.3.5.4事务管理


Sni*_*las 11

想要一个改变数据库并保持修改的测试是很奇怪的.测试应该是正交的:没有测试取决于另一个.此外,测试应该独立于测试顺序,甚至是幂等的.

因此,要么想要在setUp()方法中更改数据库并回滚方法中的更改tearDown(),要么要在测试数据库中设置一些具有良好值的测试数据库.

也许我在这里遗漏了一些东西,但通常你不应该那样想.

  • 但这不是问题. (30认同)
  • 我有一个很好的理由为什么不回滚junit测试.那么"正确答案"不是你不应该这样做的.正确的答案是可以解释如何的人. (8认同)
  • 没有回答这个问题。有时,您将junit功能用于各种目的。如果有人问我要提交junit,请提供答案,然后再说如果它是真正的junit(可重复测试)可能不是最佳实践。 (2认同)

gre*_*rep 11

只需添加注释回滚并将标志设置为false.

   @Test
   @Rollback(false)
Run Code Online (Sandbox Code Playgroud)


小智 5

来自官方文档:

默认情况下,测试事务会在测试完成后自动回滚;但是,事务提交和回滚行为可以通过@Commit 和@Rollback 注释以声明方式配置

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

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