TestNg + Spring + H2数据库中如何防止每次测试回滚操作?

How to prevent rollback operation for each test in TestNg + Spring + H2 database?

我正在使用 spring 启动集成测试与 h2 数据库和 testNg 进行集成测试。 我的 spring 引导应用程序使用 spring 数据 jpa。 对于每个测试,我都看不到之前测试保存的数据。 下面是我的集成测试 class:-

import org.springframework.test.annotation.Rollback;
import org.testng.annotations.Test;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;

@ActiveProfiles("test")
@SpringBootTest(classes = APP.class, webEnvironment = WebEnvironment.RANDOM_PORT)
public class IntegrationTest extends AbstractTestNGSpringContextTests {

    @Test(priority = 1)
    @Rollback(false)
    private void m1() {
        // save data.        
    }

    @Test(priority = 1)
    @Rollback(false)
    private void m2() {        

        // retrieve saved data. (Failed)
    }

 }

我正在使用 TestRestTemplate 来测试 PUT 和 POST Rest 端点。

您正在使用 @SpringBootTest 注释,这意味着您将启动整个 spring-boot 应用程序。 @Commit@Rollback@DataJpaTest 或类似的东西一起使用,当你的测试是 @Transactional 时有一个很好的控制。

这是我的想法:

  • 要么是TestNG有问题,要么是Spring,这种情况下,我无能为力
  • 或者你的代码有问题。您是否尝试过使用一些断点来查看您的代码是否遍历所有层。

你能展示更多你的代码吗?测试代码、控制器、服务和数据层。当然,你的配置 类,这对帮助

会很有帮助

您必须使用注释 @Commit 而不是 @Rollback

@ActiveProfiles("test")
@SpringBootTest(classes = APP.class, webEnvironment = WebEnvironment.RANDOM_PORT)
public class IntegrationTest extends AbstractTestNGSpringContextTests {

    @Test
    @Commit
    private void m1() {
    }
 }

或者,您可以使用 TransactionTemplate 进行更精细的控制。看到这个:

在事务中执行存储库调用。

    final TransactionTemplate transactionTemplate = new TransactionTemplate(txManager);
    transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
    return transactionTemplate.execute(new TransactionCallback<R>() {
        @Override
        public R doInTransaction(final TransactionStatus status) {
            myRepository.save(myEntity);
        }
    });