Java 我们如何在junit测试之间清除数据库
下面是一些支持@TestContainers功能的类Java 我们如何在junit测试之间清除数据库,java,spring-boot,testcontainers,Java,Spring Boot,Testcontainers,下面是一些支持@TestContainers功能的类 package com.changeorama.solidify; import static org.junit.Assert.assertTrue; import org.junit.jupiter.api.Test; .... @Testcontainers public class AbstractTest { @Container private static final PostgreSQLCont
package com.changeorama.solidify;
import static org.junit.Assert.assertTrue;
import org.junit.jupiter.api.Test;
....
@Testcontainers
public class AbstractTest {
@Container
private static final PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>();
static {
postgres.start();
}
@Test
void testPostgresIsRunning() {
assertTrue(postgres.isRunning());
}
@DynamicPropertySource
static void postgreSQLProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}
}
package com.changeorama.solidify;
导入静态org.junit.Assert.assertTrue;
导入org.junit.jupiter.api.Test;
....
@测试容器
公共类抽象测试{
@容器
私有静态final PostgreSQLContainer postgres=new PostgreSQLContainer();
静止的{
postgres.start();
}
@试验
void testpostgresrunning(){
assertTrue(postgres.isRunning());
}
@动态属性源
静态void postgreSQLProperties(DynamicPropertyRegistry注册表){
add(“spring.datasource.url”,postgres::getJdbcUrl);
add(“spring.datasource.username”,postgres::getUsername);
add(“spring.datasource.password”,postgres::getPassword);
}
}
package com.changeorama.solidify.repository;
导入静态org.hamcrest.CoreMatchers.is;
导入静态org.junit.Assert.assertThat;
导入java.util.List;
导入org.junit.jupiter.api.Test;
....
导入lombok.extern.slf4j.slf4j;
@Slf4j
@ActiveProfiles(profiles=“test”)
@DataJpaTest
@AutoConfigureTestDatabase(replace=AutoConfigureTestDatabase.replace.NONE)
公共类分隔RepositoryTest扩展了AbstractTest{
@自动连线
分隔存储库;
@试验
void testsavechainer(){
//负载测试数据
隔间实体组件=新隔间实体();
组件设置隔间ID(12);
公司名称(“公司abc”);
组件设置隔间大小(12);
综合性(comp);
}
@试验
void testGetAllChapters(){
List comps=compRepository.findAll();
断言(comps.isEmpty(),为(假));
}
}
有没有办法用@Testcontainers方法清理在同一测试套件中运行的测试之间的数据
我们是否有能力在测试之间清除数据库
如果@TestContainers不可能,我们是否可以手动清除数据?您可以使用来自隔间存储库的
@beforeach
和deleteAll
方法(假设它实现了JPARepository)在每次测试之前清除表,以便每次测试开始时都使用自己的数据
@AfterEach
public void setup() {
compRepository.deleteAll()
}
@Transactional
@Slf4j
@ActiveProfiles(profiles = "test")
@DataJpaTest
@Transactional
@AutoConfigureTestDatabase(replace=AutoConfigureTestDatabase.Replace.NONE)
public class CompartmentRepositoryTest extends AbstractTest{
//then your code
}
@Transactional
注释测试类时
该类层次结构在事务中运行,默认情况下,它将在完成后自动回滚
请注意
- 测试生命周期方法不支持
@Transactional
- 使用
注释但传播属性设置为@Transactional
不受支持的
(
的测试不会在事务中运行@Transactional=propagation.NOT_受支持的
)
@Rollback
@Test
@Rollback(true)
void testSaveCompartment() {}
- Rollback指示是否应在测试方法完成后回滚事务
@Test
@Rollback(true)
void testSaveCompartment() {}