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

问题描述

下面是一些支持@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.repository;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.util.List;
import org.junit.jupiter.api.Test;
....

import lombok.extern.slf4j.Slf4j;

@Slf4j
@ActiveProfiles(profiles = "test")
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class CompartmentRepositoryTest extends AbstractTest{
    
    
    @Autowired
    CompartmentRepository compRepository;
    
    @Test
    void testSaveCompartment() {
      //Load test data
        CompartmentEntity comp = new CompartmentEntity();
        comp.setCompartmentId(12);
        comp.setCompartmentName(“Comp abc”);
        comp.setCompartmentSize(12);

        compRepository(comp);
        
    }
    
    
    @Test
    void testGetAllCompartments() {

        List<CompartmentEntity> comps = compRepository.findAll();
        assertThat(comps.isEmpty(),is(false));
    }
    
   
    
}

是否可以使用@Testcontainers方法清理在同一测试套件中运行的测试之间的数据?

我们是否有能力在两次测试之间清除数据库?

如果没有@TestContainers,我们是否可以手动清除数据?

解决方法

您可以使用CompartmentRepository中的@BeforeEachdeleteAll方法(假设它实现了JPARepository)在每次测试之前清除表,以便每个测试以其自己的数据开始

@AfterEach
public void setup() {
    compRepository.deleteAll()
 }
,
  1. @Transactional

    注释测试类
    @Slf4j
    @ActiveProfiles(profiles = "test")
    @DataJpaTest
    @Transactional
    @AutoConfigureTestDatabase(replace=AutoConfigureTestDatabase.Replace.NONE)
    public class CompartmentRepositoryTest extends AbstractTest{
      //then your code
    }
    

使用@Transactional注释测试类时,其中的每个测试方法 该类层次结构在事务中运行,默认情况下,它将在完成后自动自动回滚

请注意

    测试生命周期方法不支持
  • @Transactional

  • @Transactional注释但传播属性设置为NOT_SUPPORTED @Transactional = Propagation.NOT_SUPPORTED的测试不在事务内运行。

  1. 您可以在类级别或测试方法上使用@Rollback

    @Test
    @Rollback(true)
    void testSaveCompartment() {}
    
  • 回滚表示测试方法完成后是否应回滚事务。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...