Java 在没有活动的情况下,是否有选择在测试早期失败?

Java 在没有活动的情况下,是否有选择在测试早期失败?,java,vert.x,junit5,Java,Vert.x,Junit5,使用Vert.x和JUnit5进行的简单集成测试可能类似于以下代码块 @Test @Timeout(value = 10, timeUnit = TimeUnit.SECONDS) void some_test(Vertx vertx, VertxTestContext testContext) { // do nothing in this example. } 此简单测试将等待10秒,然后由于超时而失败。我想知道是否有一种选择,可以在不等待超时的情况下提前使测试失败。由于没有活动,Ve

使用Vert.x和JUnit5进行的简单集成测试可能类似于以下代码块

@Test
@Timeout(value = 10, timeUnit = TimeUnit.SECONDS)
void some_test(Vertx vertx, VertxTestContext testContext) {
  // do nothing in this example.
}
此简单测试将等待10秒,然后由于超时而失败。我想知道是否有一种选择,可以在不等待超时的情况下提前使测试失败。由于没有活动,Vert.x可以推断,如果测试尚未完成,那么它将永远不会完成。没有活动,我的意思是没有正在运行的任务或计时器。只有外部操作才能导致进一步的操作,但我认为许多测试没有这样的外部触发器


我想知道Vert.x是否提供了这样一种可能性,即“没有外部触发器。在无事可做时停止。”

Vert.x是被动的,这意味着您的实现会对其他参与者通过事件总线发送的事件作出反应

通常,您只能在事件总线上进行监听。您的实现无法确定外部事件的不存在是否是某种错误。如果其他参与者无话可说,这可能是一个非错误的条件

要确定是否没有外部触发因素,如果什么都不做,就要尽早通过测试,这只能通过了解所有其他参与者的内部状态来实现

有人可能会说,这不是单元测试的任务,因为其他参与者可能被认为不属于您的单元

解决方案的建议

您的所有其他参与者(即Verticle)可能会在某一点发出一个事件,通知您的测试实现,他们已经完成了他们的工作,没有什么事情可做

您的测试可以计算那些已完成的事件,并通过调用
testContext.completeNow()相应地采取行动,一旦收到所有已完成的事件


据我所知,vert.x-toolkit或junit中没有选项或工具为您完成这项工作。您必须自己实现它。

我想,如果只有外部操作会导致进一步的活动,Vert.X或JUnit就无法推断在接下来的10秒内不会发生任何外部操作。如果您没有外部触发器,那么测试在等待什么?@SteffenJacobs,这样的测试可能会有多个垂直对话。因此,可以测试多个参与者的互操作性。或者只是一个参与者的消息接口。在某些情况下,甚至可能出现Vert.x仅在测试中用于提供基本功能的情况,例如。我不确定我是否正确理解了答案。你还想说这样的功能是不可能或不实用的吗?这是可能的,是否实用取决于你。我可以想象合理的测试用例。但我不知道vert.x或junit中有任何内置函数可以帮助您解决问题中描述的问题。就我所理解的反应式范例而言,“当没有什么事情可做时就停止”的需求不能通过框架函数来实现,而只能通过程序员自己的单独实现来实现。感谢您的澄清。在我接受答案之前,我仍然会等待一点。也许有人对框架是否支持相关内容有明确的答案。除此之外,我仍然认为该框架可以实现“在没有什么事情可做时停止”。注意,没有外部触发器基本上意味着所有相关线程都由Vert.x管理。从框架的角度来看,其他行动者不是外部的。但也许它与范式不匹配,或者不值得付出努力。无论如何,这对这个问题来说并不重要。