如何解决如何在 JEE 实体管理器中使用来自 testcontainer 的数据源
在一个项目中,我们没有使用 spring(存在大量关于 testcontainers 的信息),而是一个相当旧的 jboss 版本 6.4.0.EAP 和 hibernate,我们无法更改。测试框架是 junit4 并且在某种程度上是 arquillian。
我尝试改进集成测试,并希望至少在数据库测试设置中使用 testcontainers。我知道如何启动 testcontainer(在那种情况下是 MysqLcontainer)以及如何运行现有的 liquibase 脚本。
我坚持的是: 如何使用数据源,我可以在这里从我启动的容器中获取
public DataSource getDataSource(MysqLContainer<?> MysqLContainer) {
MysqLDataSource ds = new MysqLDataSource();
ds.setUser(MysqLContainer.getUsername());
ds.setPassword(MysqLContainer.getpassword());
ds.setURL(MysqLContainer.getJdbcUrl());
return ds;
}
创建一个实体管理器,然后将其注入现有的 Dao 中? 应用程序中的 Dao 定义如下
@ApplicationScoped
public class MyDao {
@Inject
private EntityManager entityManager;
protected EntityManager getEM() {
return entityManager;
}
}
解决方法
您不将 Spring 用于您的 JEE 项目,但您只能将其用于数据源层的测试。
您需要的是:
- 启动 mysql 作为 docker 容器
- 使用 liqubase 应用 DDL 语句来创建表等
- probably populate tables
- 并在测试中访问
javax.persistence.EntityManager
这是一个简化版本,以获得一个想法:
@DataJpaTest
@TestPropertySource(properties = {"spring.jpa.hibernate.ddl-auto=validate"})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ContextConfiguration(initializers = { MySqlLiquibaseBaseIT.Initializer.class })
@Testcontainers
public class MySqlLiquibaseBaseIT {
@Container
public static MySQLContainer<?> mysql = new MySQLContainer<>(
DockerImageName
.parse(MySQLContainer.NAME)
.withTag("5.7.22"));
@Configuration
@EnableJpaRepositories
@EntityScan
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
TestPropertyValues.of(
"spring.datasource.url=" + mysql.getJdbcUrl(),"spring.datasource.username=" + mysql.getUsername(),"spring.datasource.password=" + mysql.getPassword(),"spring.datasource.driver-class-name=" + mysql.getDriverClassName())
.applyTo(configurableApplicationContext.getEnvironment());
}
@Bean
public SpringLiquibase springLiquibase(DataSource dataSource) {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setDropFirst(true);
liquibase.setDataSource(dataSource);
liquibase.setChangeLog("classpath:/db/changelog/db.changelog-master.yml");
return liquibase;
}
}
}
实际上我用容器做了更多有用的事情,比如:
- mysql 自定义配置
- 启用容器日志记录
- sql 语句日志
The full MySqlLiquibaseBaseIT class can be found here
在您的测试中,您可以扩展它并直接使用 DataSource
或 EntityManager
:
public class ExampleEntityIT extends MySqlLiquibaseBaseIT {
public static final long ENTITY_ID = 25L;
@Autowired
private DataSource dataSource;
@Autowired
private EntityManager entityManager;
@Test
public void injectedComponentsAreNotNull(){
Assertions.assertNotNull(dataSource);
Assertions.assertNotNull(entityManager);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。