【发布时间】:2021-05-02 22:58:46
【问题描述】:
我正在寻找一种方法来保持我的组件测试自包含。 因此,为了实现这种行为,在某些测试中,我需要有一个“干净的数据库”或至少一个“干净的表”。我仍然找不到在测试容器中执行此操作的方法。 所以这是我迄今为止尝试过的: 我的容器设置类:
公共类 PostgreSqlTestContainer 实现 QuarkusTestResourceLifecycleManager {
public static final PostgreSQLContainer<?> POSTGRES = new PostgreSQLContainer<>("postgres:alpine");
@Override
public Map<String, String> start() {
POSTGRES.start();
return some_db_config_as_per_doc;
}
@Override
public void stop() {
POSTGRES.stop();
}
这是测试类:
@QuarkusTest
@QuarkusTestResource(PostgreSqlTestContainer.class)
class UserResourcesTest {
@Test
scenario_one(){
// create a new user
// do some stuff (@POST.. check HTTP == 201)
}
@Test
scenario_two(){
// create new user
// do some stuff (@POST.. check HTTP == 201) (pass)
// look for all users on database
// do more stuff (@GET.. check HTTP == 200) (pass)
// assert that only 1 user was found
// since scenario_one should not interfere with scenario_two (fail)
}
}
第二种情况失败,因为第一次测试中的一些“脏”仍在 db 容器上。 我尝试为每个测试停止/启动容器。 (非常非常慢的过程,有时我会出错,然后又非常慢)。
@BeforeEach
void setup(){
PostgreSqlTestContainer.POSTGRES.stop();
PostgreSqlTestContainer.POSTGRES.start();
}
还尝试截断表/删除整个数据库:
@Inject
EntityManager entityManager;
@BeforeEach
private void rollBack(){
truncate();
}
void truncate(){
Query nativeQuery = entityManager.createNativeQuery("DROP DATABASE IF EXISTS db_name");
nativeQuery.executeUpdate();
}
我正在寻找解决此问题的任何方法,我只想在每次测试之前以某种方式使用@BeforeEach 来清理数据库。我的意思是,我想要的只是为每个测试提供一个干净的环境。
【问题讨论】:
标签: java postgresql junit5 quarkus testcontainers