使用 Testcontainers 进行 Dropwizard 集成测试
Posted
技术标签:
【中文标题】使用 Testcontainers 进行 Dropwizard 集成测试【英文标题】:Dropwizard integration testing with Testcontainers 【发布时间】:2017-12-19 04:09:08 【问题描述】:我正在尝试针对 dockered 数据库运行 dropwizard 的集成测试。
Dropwizard Testcontainers我尝试过的:
@ClassRule
public static final PostgreSQLContainer postgres = new PostgreSQLContainer();
@ClassRule
public final DropwizardAppRule<Configuration> RULE = new DropwizardAppRule<>(
Application.class,
CONFIG_PATH,
ConfigOverride.config("dataSourceFactory.url", postgres.getJdbcUrl()),
ConfigOverride.config("dataSourceFactory.user", postgres.getUsername()),
ConfigOverride.config("dataSourceFactory.password", postgres.getPassword())
);
我收到Caused by: java.lang.IllegalStateException: Mapped port can only be obtained after the container is started
将这些链接在一起也不起作用
@ClassRule
public static TestRule chain = RuleChain.outerRule(postgres = new PostgreSQLContainer())
.around(RULE = new DropwizardAppRule<>(
Application.class,
CONFIG_PATH,
ConfigOverride.config("dataSourceFactory.url", postgres.getJdbcUrl()),
ConfigOverride.config("dataSourceFactory.user", postgres.getUsername()),
ConfigOverride.config("dataSourceFactory.password", postgres.getPassword())
));
终于可以了,但据我了解,它为每个测试运行新的 DropwizardAppRule,这不好...
@ClassRule
public static final PostgreSQLContainer postgres = new PostgreSQLContainer();
@Rule
public final DropwizardAppRule<Configuration> RULE = new DropwizardAppRule<>(
Application.class,
CONFIG_PATH,
ConfigOverride.config("dataSourceFactory.url", postgres.getJdbcUrl()),
ConfigOverride.config("dataSourceFactory.user", postgres.getUsername()),
ConfigOverride.config("dataSourceFactory.password", postgres.getPassword())
);
那么我怎样才能在创建 DropwizardAppRule 之前链接规则,以便首先启动 PostgreSQLContainer 并启动容器?
【问题讨论】:
【参考方案1】:通过将 PostgreSQL Container 作为单例启动来使其工作。
public static final PostgreSQLContainer postgres = new PostgreSQLContainer();
static
postgres.start();
@ClassRule
public final DropwizardAppRule<Configuration> RULE = new DropwizardAppRule<>(
Application.class,
CONFIG_PATH,
ConfigOverride.config("dataSourceFactory.url", postgres.getJdbcUrl()),
ConfigOverride.config("dataSourceFactory.user", postgres.getUsername()),
ConfigOverride.config("dataSourceFactory.password", postgres.getPassword())
);
【讨论】:
以上是关于使用 Testcontainers 进行 Dropwizard 集成测试的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TestContainers 创建 apache spark 独立集群以进行集成测试?
在 SpringBoot 中使用 Testcontainers 进行 Spring Data Elasticsearch 集成测试
使用 Testcontainers + Quarkus + MongoDB 进行集成测试
使用 testcontainers postgresql 进行 Spring 启动测试
Hibernate 在启动时进行 DDL 验证时不使用 @Table。使用 Flyway 和 TestContainers