问题描述
我需要在 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 (将#修改为@)