我如何对 java 中的 class 的特定方法在给定持续时间内定期调用进行单元测试

How can I Unit test that a specific method of a class in java was periodically invoked for a given duration

我正在创建错误处理程序。这将重复调用失败的方法,在给定的持续时间内有一些固定的延迟。

例子。

我有一个与外界交互的服务class。

class Service {
   void doSomething(); 
}

而且我还有一个用于该服务的错误处理程序,它将重复调用 service.doSomething() 持续 5 分钟,固定延迟 30 秒。

class ErrorHandler { 
   private Service service;

   void handle() {
     //repeatedly invoke service.doSomething();
   }
}

我如何为这个错误处理程序编写单元测试来测试它确实

service.doSomething()

在 5 分钟内被重复调用。我知道 mockito 的 verificationmode provides different options to verify number of times. But in this case I'm specifically interested to test that a method was repeatedly invoked within a given duration . I've also explored awaitility 但不确定它是否有任何可以提供帮助的方法。

非常感谢任何建议:)

谢谢 金丹

你可以让它休眠然后调用自己吗?但是那样你就会占用所有的内存。 也许您甚至可以使用多线程?

您可以通过模拟 doSomething() 方法并提供您自己的实现来记录调用该方法的时间。这是一个例子:

final List<LocalDateTime> list = new ArrayList<>();
Service service = Mockito.mock(Service.class);
Mockito.doAnswer(a -> list.add(LocalDateTime.now())).when(service).doSomething();

在此示例中,每次调用该方法时,代表当前时间戳的LocalDateTime都会保存到列表中。 最后,您所要做的就是遍历列表,比较相邻日期,找到间隔并将它们与预期值进行比较。第一个和最后一个日期之间的间隔将显示总持续时间。