休眠和测试容器

问题描述

我需要在 docker 容器中运行我的测试。为此,我有 Testcontainers 库。除此之外,我使用休眠。此外,我使用 Flyway 来运行一些初始 sql 脚本。我是 Testcontainers 和 Hibernate 的新手,不明白为什么我会收到“Relation not found exception”。这是我的应用的组织方式:

初始化容器的抽象测试:

@ActiveProfiles("test")
@SpringBoottest(webEnvironment = SpringBoottest.WebEnvironment.RANDOM_PORT)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ContextConfiguration(initializers = AbstractIT.DockerPostgreDataSourceInitializer.class)
@Testcontainers
public class AbstractIT {

    public static PostgresqlContainer<?> postgreDBContainer = new PostgresqlContainer<> 
    ("postgres:12.2");

    static {
        postgreDBContainer.start();
    }

    public static class DockerPostgreDataSourceInitializer implements 
        ApplicationContextinitializer<ConfigurableApplicationContext> {

        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {

            TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
                    applicationContext,"spring.datasource.url=" + postgreDBContainer.getJdbcUrl(),"spring.datasource.username=" + postgreDBContainer.getUsername(),"spring.datasource.password=" + postgreDBContainer.getpassword()
            );
        }
    }
}

我对扩展抽象 AbstractIT 的“创建”函数的测试:

@SpringBoottest
class JdbcGroupDaoTest extends AbstractIT {
    @Autowired
    private JdbcGroupDao jdbcGroupDao;

    @Test
    void create() throws Exception {
        jdbcGroupDao.setFactory(Persistence.createEntityManagerFactory("university-test"));
        Group group = new Group("Test group");
        Group expected = new Group(1L,"Test group");
        Group actual = jdbcGroupDao.save(group);
        assertEquals(expected,actual);
    }
}

被测类:

@Component
public class JdbcGroupDao extends JdbcAbstractDao<Group,Long> implements GroupDao {
    private EntityManagerFactory factory ;
    private static final Logger LOGGER = LoggerFactory.getLogger(JdbcGroupDao.class);

@Override
public void setFactory(EntityManagerFactory factory){
    this.factory = factory;
}

@Override
protected Group create(Group group) {
    if(factory==null){
        factory=Persistence.createEntityManagerFactory("university");
    }
    EntityManager entityManager = factory.createEntityManager();
    entityManager.getTransaction().begin();
    entityManager.persist(group);
    entityManager.getTransaction().commit();
    entityManager.close();
    entityManager.flush();
    factory.close();
    return group;
}

我的 Hibernate 配置文件

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
    http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="university">
    <properties>
        <property name="javax.persistence.jdbc.url" 
value="jdbc:postgresql://localhost:5432/university" />
        <property name="javax.persistence.jdbc.user" value="admin" />
        <property name="javax.persistence.jdbc.password" value="admin" />
        <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
    </properties>
</persistence-unit>

<persistence-unit name="university-test">
    <properties>
        <property name="javax.persistence.jdbc.driver" 
value="org.testcontainers.jdbc.ContainerDatabaseDriver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:tc:postgresql:9.6.8:///university"/>
        <property name="javax.persistence.jdbc.user" value="admin" />
        <property name="javax.persistence.jdbc.password" value="admin" />
    </properties>
</persistence-unit>

</persistence>

错误信息:

Caused by: org.postgresql.util.PsqlException: ERROR: relation "groups" does not exist

在这里有两个持久性单元,因为这是我发现防止休眠更改真实数据库中数据的唯一方法。我相信这是我出错的主要原因。虽然我不知道如何解决它。 如果您需要有关我的代码的更多信息,请随时询问,我会将您需要的任何内容添加到我的帖子中。 提前致谢。

编辑: 飞行路线初始化。 .sql 文件。 (仅添加与“组”相关的代码):

create table groups
(
    id    serial
        constraint groups_pkey
            primary key,title varchar(100)
);
alter table groups
    add constraint uq_groups_title UNIQUE
        (
         title
            );

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)