问题描述
下面是一些支持@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中的@BeforeEach
和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
注释但传播属性设置为NOT_SUPPORTED
(@Transactional = Propagation.NOT_SUPPORTED
)的测试不在事务内运行。
-
您可以在类级别或测试方法上使用
@Rollback
@Test @Rollback(true) void testSaveCompartment() {}
- 回滚表示测试方法完成后是否应回滚事务。