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);
}
});
我正在使用 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);
}
});