0

我想测试一个通过 EventBus 接收请求并通过 EventBus 发送结果的工人 Verticle。单个请求可能会导致 0,1,2,... 响应——在一般情况下,我们不知道会得到多少响应。

业务逻辑是,一旦处理完成,请求就会被确认,但是响应是以“即发即弃”的方式发送的——因此我们只知道响应已发送,不一定它们已经交付。

我正在为这个verticle写一个测试。

测试代码计划如下:

1. set up consumer for responses
2. send a request
3. wait until request is acked by the worker verticle
4. wait until consumer finishes validating the responses

这里的问题是第 4 步——在一般情况下,我们不知道是否仍有一些响应在飞行中。

蛮力解决方案显然是等待一些合理的时间——通常几毫秒就足够了。然而。我更喜欢概念性的东西。

我想到的一个解决方案是:

  1. 发送一些我们确定会有单一响应的请求;
  2. 等到消费者收到相应的响应。这应该可行,但我不喜欢我通过 SUT 发送两条消息而不是一条消息这一事实。

一个不同的解决方案是从测试代码发送一个额外的响应,一旦我们确认请求已被处理 - 但它会被认为是同一个发件人吗?EventBus 只保证来自同一个发件人的交付顺序,而不是来自不同的发件人。测试不在集群模式下运行,所有操作都在同一台机器上执行,但不一定在同一个线程中。

另一种解决方案是以某种方式检查 EventBus 现在是否为空,但据我了解,这是不可能的。

还有其他(更好的)解决方案吗?

4

1 回答 1

0

我现在选择的解决方案(在使用 vertx/EventBus 的半年之后)是发送两条消息。只有在第一个消息的处理完成后,第二个消息才会得到确认。

这仅在您有一个消费者时才有效,这样您的两条消息就无法并行处理。

于 2021-04-25T05:54:48.533 回答