测试容器的初始化脚本无法正常工作

时间:2021-06-21 17:02:07

标签: java sql spring-boot testcontainers

正如我在标题中提到的,我在测试容器的初始化脚本方面遇到了问题。

脚本内容:

CREATE SCHEMA IF NOT EXISTS dbo_core;

CREATE TABLE IF NOT EXISTS dbo_core.company (
    ID BIGINT generated by default as identity primary key,
    NAME VARCHAR(255) not null
);

INSERT INTO dbo_core.company (ID, NAME) VALUES (1, 'Company1');

通过命令查看docker内部后:

docker exec -it cranky_ramanujan psql -Utest

结果是:

test=# select * from dbo_core.company;
 id | name 
----+------
(0 rows)

有人知道我应该改进什么吗? 先感谢您。 :)

编辑。

CompanyDaoTest.java:

@RunWith(SpringRunner.class)
@Testcontainers
@SpringBootTest(classes = OutCaloriesCoreApplication.class)
public class CompanyDaoTest {

    @Container
    public static PostgreSQLContainer<OutCaloriesPostgresqlContainer> postgreSQLContainer = OutCaloriesPostgresqlContainer.getInstance().withInitScript("db-init-script.sql");

    @Autowired
    private CompanyDao companyDao;

    @BeforeAll
    static void init() {
        postgreSQLContainer.start();
    }

    @Test
    @Transactional
    void findByIdShouldEndWithSuccess() {
        Company byId = companyDao.findById(1L);
        assertEquals(byId.getId(), 1L);
    }
}

OutCaloriesPostgresqlContainer.java:

public class OutCaloriesPostgresqlContainer extends PostgreSQLContainer<OutCaloriesPostgresqlContainer> {
    private static final String IMAGE_VERSION = "postgres:11.1";

    private static OutCaloriesPostgresqlContainer container;

    private OutCaloriesPostgresqlContainer() {
        super(IMAGE_VERSION);
    }

    public static OutCaloriesPostgresqlContainer getInstance() {
        if (container == null) {
            container = new OutCaloriesPostgresqlContainer();

        }
        return container;
    }

    @Override
    public void start() {
        super.start();
        System.setProperty("DB_URL", container.getJdbcUrl());
        System.setProperty("DB_USERNAME", container.getUsername());
        System.setProperty("DB_PASSWORD", container.getPassword());
    }

    @Override
    public void stop() {
        //do nothing, JVM handles shut down
    }
}

测试容器版本为 1.15.3。

日志:https://pastebin.com/qgrPb3JL

1 个答案:

答案 0 :(得分:0)

空表的原因是在“create-drop”上设置了“spring.jpa.hibernate.ddl-auto”属性。 它使 init 脚本创建的表和值被 hibernate 生成的新表覆盖。
就我而言,最好的解决方案是将此属性设置为“无”。