【问题标题】:How to use datasource from testcontainer in JEE entity manager如何在 JEE 实体管理器中使用来自 testcontainer 的数据源
【发布时间】:2021-05-22 05:49:33
【问题描述】:

在一个项目中,我们没有使用 spring(其中存在大量关于 testcontainers 的信息),而是一个相当旧的 jboss 版本 6.4.0.EAP 和休眠,我们无法更改。测试框架是junit4,在某种程度上是arquillian。

我尝试改进集成测试,并希望至少在数据库测试设置中使用测试容器。我知道如何启动一个测试容器(在这种情况下是 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;
    }
}

【问题讨论】:

  • 你试过这样的事情吗? stackoverflow.com/questions/22137454/…我实际上不确定这是否是正确的方法,但看起来与您的问题相似。
  • @VitalyChura 我试一试 - 这似乎是要走的路,只是项目中 arquillian 测试设置过于复杂而造成的一些问题。感谢您的提示。

标签: java jboss java-ee-6 entitymanager testcontainers


【解决方案1】:

您的 JEE 项目不使用 Spring,但您只能将其用于数据源层的测试。

你需要的是:

  • 将 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

在您的测试中,您可以扩展它并直接使用DataSourceEntityManager

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);
  }
}

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 2015-03-17
    • 1970-01-01
    • 2014-01-09
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多