spring JUnit测试总是回滚事务

olqngx59  于 11个月前  发布在  Spring
关注(0)|答案(8)|浏览(92)

我正在对一个应用程序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吗?

balp4ylt

balp4ylt1#

它应该像你期望的那样工作,但可能是你在测试中打开了你的类中的另一个事务,或者你在某个地方有其他功能/或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
    }
}

字符串
@参见Spring参考章节9.3.5.4交易管理(或当前版本)

xcitsw88

xcitsw882#

只需添加注解Rollback并将标志设置为false。

@Test
   @Rollback(false)

字符串

deikduxw

deikduxw3#

这是奇怪的愿望测试,改变你的数据库和保持修改.测试应该是正交的:没有测试依赖于其他.此外,测试应该是独立的测试顺序,甚至idempotent .
因此,要么你想在你的setUp()方法中更改你的数据库,并回滚你的tearDown()方法中的更改,要么你想设置一个测试数据库,其中有一些好的值用于测试。
也许我在这里错过了一些东西,但通常你不应该想要的。

lf3rwulv

lf3rwulv4#

来自官方文档:
默认情况下,测试事务将在测试完成后自动回滚;但是,可以通过@Commit和@Rollback注解以声明方式配置事务提交和回滚行为
https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#integration-testing-annotations
@Commit表示事务性测试方法的事务应该在测试方法完成后提交。@Commit可以用作@Rollback(false)的直接替换,以便更明确地传达代码的意图。

svmlkihl

svmlkihl5#

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

字符串

t5zmwmid

t5zmwmid6#

我同意拉尔夫的回答。

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

在我的简单经验中,注解 *@ translation * 将正确地定义每个测试应该运行的事务上下文,将特定的当前Rollback子句委托给这个上下文(如Ralph所示)。
Ralph的回答是有用的,同时Snicolas的回答涉及到管理测试上下文的特定情况。idemistry是集成和自动测试的基础,但应该有不同的实现方法。问题是,你有哪种方法?这些方法有什么行为?

[...]
   @Transactional

   public class Test {

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

   [...]

字符串
是简单的,问题连贯的方式:)

jqjz2hbq

jqjz2hbq7#

1.在测试类级别添加@Rollback
1.在测试方法中添加@Transactional(value = "your_ManagerName",rollbackFor = Exception.class)

izkcnapc

izkcnapc8#

使用类级别注解禁用自动回滚

@Transactional(propagation = NOT_SUPPORTED).

字符串

相关问题