【问题标题】:How do we do a purge of the database in between junit tests我们如何在 junit 测试之间清除数据库
【发布时间】:2021-01-08 22:54:22
【问题描述】:

以下是一些支持@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,我们是否可以手动清除数据?

【问题讨论】:

    标签: java spring-boot testcontainers


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      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() {}
        
      • Rollback 指示在测试方法完成后是否应回滚事务。

      【讨论】:

      • 在并行测试执行中使用 Transactional 可以正常工作吗?是否有任何手动方法可以在 AfterEach 方法中仅删除所有表中的数据(而不是表本身)?
      • 是的,它会正常工作。如果您想删除测试数据,@Deadpool 解决方案应该可以工作
      • 我的意思是检查死侍给出的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多