Mockito等待来自新线程的方法执行多次

时间:2016-10-19 08:03:22

标签: java spring multithreading mockito azureservicebus

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

对于发布,通过此方法测试,我与队列连接并发布一些虚拟消息,而不是使用Mockito#spy启动新线程。到目前为止,只有一条消息存在于其他IT方面。比我使用ArgumentCaptor看到我发送到队列的消息是由我的应用程序线程成功处理的。

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

我已经阅读了CountDownLatch,但是只要需要处理我的所有消息,就无法弄清楚如何等待线程执行,如果这确实是一个使用帮助

有人可以建议我在这里尝试做的实施设计吗?或者我有什么机会尝试做的事情是不可能的?

提前致谢!

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

1 个答案:

答案 0 :(得分:1)

试试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页面。