java - Mockito等待新线程的方法执行多次

标签 java spring multithreading mockito azureservicebus

所以我有以下东西:一个 Spring Boot 应用程序,它通过监听队列中的消息并处理它们以及一些 UT 和 IT 来启动。现在,在集成测试类中,我想验证如果我将大量消息发布到输入队列,我的应用程序不会崩溃。

为了发布,从这个方法测试中,我连接到队列并发布一些虚拟消息,然后使用 Mockito#spy 启动一个新线程。到目前为止,其他 IT 只针对一条消息存在。我使用 ArgumentCaptor 来查看发送到队列的消息是否已被我的应用程序线程成功处理。

我不知道该怎么做,就是等待数千个处理方法调用的执行,看看应用程序不会崩溃。从队列中读取所有消息后,测试应该结束,不会引发任何异常(我不验证消息,因为现在不需要)。处理时间应在 1 到 2 小时之间。

我读过有关 CountDownLatch 的内容,但不知道如何等待线程执行,只要它需要处理我的所有消息,如果这确实是一种辅助使用的话。

任何人都可以为我在这里尝试做的事情建议一个实现设计吗?或者我想做的事情是否有可能是不可能的?

提前致谢!

更新: 我无法修改测试的应用程序方法或类,那么有没有办法检索对我的方法的调用次数?谢谢@Mykhailo Kovalskyi

最佳答案

尝试Awaitility 。在这种特殊情况下,测试用例应该异步启动消息处理,然后使用 Awaitility 等待条件。

这个将永远等待,直到条件满足。

Awaitility.await().forever().until(conditionIsSatisfied());

或者,您可以指定最短和/或最长等待时间:

Awaitility.await().atLeast(1, HOURS).and().atMost(2, HOURS).until(conditionIsSatisfied());

其中conditionIsSatisfied可调用,能够检查是否已经处理了预期数量的消息:

private Callable<Boolean> conditionIsSatisfied() {
      return new Callable<Boolean>() {
            public Boolean call() throws Exception {
                  return allMessagesProcessed;
            }
      };
}

参见usage页面以获取更多示例。

关于java - Mockito等待新线程的方法执行多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40125515/

相关文章:

Android线程有时不启动

java - 为什么我的KeyAdapter总是落后一步?

Java :Kill process runned by Runtime. getRuntime().exec()

java - 即使我输入了有效数据,Spring Security也会返回错误

c# - 如何将诊断添加到 C# 锁定功能以进行多线程调试

Python MD5 哈希计算更快

java - 如何创建表示 Java long 的字符串,就好像它是无符号的 64 位值一样

java - 使用 BCrypt 将 SQLite 数据库中的哈希密码与用户输入进行比较

java - 如何在 spring mvc 的 session 中添加和检索对象

java - 如何使用 Spring 4 使用动态凭证发送电子邮件