Java 我们如何在junit测试之间清除数据库

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

下面是一些支持@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 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指示是否应在测试方法完成后回滚事务

    在并行测试执行中,事务性的使用可以正常工作吗?在AfterEach方法中,是否有任何手动方式可以仅删除所有表中的数据(而不是表本身)?是的,它可以正常工作@如果您想删除测试数据,死区池解决方案应该有效。我的意思是检查死区池中给定的答案
    @Test
    @Rollback(true)
    void testSaveCompartment() {}