在测试中,我有两个使用git commit -m"<message>"
和Junit5的容器,分别是git push
和@Testcontainers
。
Kafka
执行测试时,我发现一个错误,因为KafkaConnect
中的Kafka Connect服务未正确启动(映射的端口8083未监听)。这是因为@Container
private final KafkaContainer kafka = new KafkaContainer()
.withNetwork(network)
.withNetworkAliases("kafka");
@Container
private final GenericContainer KafkaConnect =
new GenericContainer("confluentinc/cp-kafka-connect:latest")
.withEnv("CONNECT_BOOTSTRAP_SERVERS", "kafka:9092")
.withEnv("CONNECT_REST_PORT", 8083)
.withNetwork(network)
...
在kafkaConnect
之前启动,并且在kafkaConnect
执行期间到达kafka
url时,由于kafka:9092
尚未运行,因此未获得响应。
然后,我尝试暂停kafkaConnect
的启动,以等待kafka
确保kafkaConnect
的可用性。
我尝试了不同的方法来执行此操作,但是我没有解决问题。 我试图添加一些配置。
kafka
。据我所知,此配置不会启动启动操作。只是增加了检查容器是否启动的时间。
kafka:9092
我还尝试了startupTimeout
的一些配置,例如基于超时的配置,预期会产生与.withStartupTimeout(Duration.of(240, SECONDS))
相同的结果
waitingFor
基于端口或基于端口,这不能解决我的问题,因为它不是指向withStartupTimeout
容器,而是指向.waitingFor(Wait.defaultWaitStrategy().withStartupTimeout(...))
。
kafka
我也尝试添加一些启动尝试,但由于kafkaConnect
有时会重新启动,但总是在.waitingFor(Wait.forHttp("http://kafka:9092"))
之前重新启动,因此无法解决问题。
作为解决方案,我删除了kafkaConnect
声明中的kafka
以便使用manage手动管理其生命周期,因此我在测试用例中添加了显式开始,请参见下文
@Container
这确保kafkaConnect
之后@Test
test() {
kafkaConnect.start();
...
}
开始。但是,我没有找到一种解决方案来通过策略,策略或类似方法在容器定义期间定义顺序,以增加容器之间的依赖关系并避免强制性和手动的生命周期管理。
有可能吗?
答案 0 :(得分:0)
import org.junit.rules.RuleChain;
// @Container <-- Remove annotation.
private final KafkaContainer kafka = new KafkaContainer()...;
// @Container <-- Remove annotation.
private final GenericContainer kafkaConnect =
new GenericContainer("confluentinc/cp-kafka-connect:latest")
.withEnv("CONNECT_BOOTSTRAP_SERVERS", "kafka:9092")
...;
// Start the containers in the correct order. Prevents
// "Mapped port can only be obtained after the container is started"
// error.
@Rule
public final RuleChain chain =
RuleChain
// Started first.
.outerRule(kafka)
// Started later.
.around(kafkaConnect);