Java JUnit测试总是回滚事务

Java JUnit测试总是回滚事务,java,spring,junit4,Java,Spring,Junit4,我正在对应用程序DAO运行一个简单的JUnit测试。问题是我总是得到: javax.persistence.RollbackException: Transaction marked as rollbackOnly JUnit测试是: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:com/my/app/context.xml"} @TransactionConfigur

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

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支持是否总是将rollback设置为true?

希望测试更改数据库并保留修改是很奇怪的。 测试应该是正交的:没有测试依赖于其他测试。 此外,测试应该独立于测试顺序,甚至是

因此,要么您想更改
setUp()
方法中的数据库,然后回滚
tearDown()
方法中的更改,要么您想为测试设置一个包含一些良好值的测试数据库


也许我在这里遗漏了一些东西,但通常你不应该想要它。

它应该像你期望的那样工作,但可能是你在测试中的类中打开了另一个事务,或者你在某个地方有其他特性/或bug

顺便说一句,此注释应为:

@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
    }
}

@见

我同意拉尔夫的回答

传播.REQUIRES\u NEW创建一个新事务,这可能与运行测试的主要事务路由不匹配

根据我的简单经验,注释@Transactional将正确地定义每个测试应该在其中运行的事务上下文,将特定的current Rollback子句委托给这个上下文(如Ralph所示)

拉尔夫的答案是有用的,同时斯尼科拉斯的答案涉及管理测试上下文的一个特殊案例。 幂等性是集成和自动测试的基础,但应该是实现它们的不同方法。 问题是,你有哪种方法?这些方法有什么行为

   [...]
   @Transactional

   public class Test {

   @Test
   @Rollback(false)
   public void test() {

   [...]

是一种简单、问题连贯的方法:)

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

   @Test
   @Rollback(false)

从正式文件:

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

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

  • 在测试类级别上添加
    @Rollback

  • 在测试方法上添加
    @Transactional(value=“your_ManagerName”,rollboor=Exception.class)


  • 你从哪里得到例外?你能发布stacktrace吗?但这不是问题。我有一个很好的理由不回滚junit测试。所以“正确答案”并不是说你不应该这么做。正确的答案是能够解释如何添加数据的人。请您添加一些注释,说明如何在setup方法中添加数据,仍然可以在测试代码中的任何位置看到数据,然后将其回滚?不回答问题。有时,您会出于各种目的使用junit功能。如果有人问我想在junit中提交,请给出答案,然后说如果它是真的junit(可重复测试),这可能不是最佳实践。@SeanPatrickFloyd提示是REQUIRED_NEW,这表明他显然试图在执行集成测试之前设置特定的db状态。因此,它需要在测试的act部分之前保持。所以,是的,我认为我们应该坚持回答这个问题。让我非常困惑的是,即使异常一直冒泡,测试也会提交txn,而通常情况下(@Transactional on business class,而不是on test method),这会触发txn回滚。只适用于检查过的异常。未选中的将自动回滚。
    I use Junit5, both commit and rollback(false) works with me.
    
        @ExtendWith(SpringExtension.class)
        @SpringBootTest
        @Transactional
        public class MyIntegrationTest {
    
          @Test
          @DisplayName("Spring Boot Will Rollback Data, " +
          "Can Disable it By Add @Commit Or @Rollback(false) Annotation")
          //@Commit
          //@Rollback(false)
          public void test() throws Exception {
           //your test codes here...
          }