我正在为Amqp Message Listener编写Junit测试。这是测试的编写方式。我向交换机发送消息并引入1秒的延迟(假设监听器将在该时间范围内完成其工作)。这种方法会减慢构建过程,因为这样的15-20个测试执行至少需要20秒。有一种方法我可以做到这一点是一种非阻塞方式。用于传递一个验证测试的调用处理程序在听众完成工作之后。像Actors这样的东西可以在内部使用
答案 0 :(得分:0)
虽然不是非阻塞'单元测试,您可以使用Awaitility创建轮询间隔,以及JUnit中的最长等待时间。对于依赖于异步结果的测试非常有用。
您可以将轮询时间设置为小的,例如10 milis,最长持续时间。每10毫秒,您的方法将评估一些条件将被触发。它将继续被调用,直到条件返回true,或者达到允许的最大时间。此时它将抛出异常,未通过单元测试。
答案 1 :(得分:0)
另一种方法是让处理程序在他们自己的线程中运行,就像它们与amqp-client一样,并简单地阻塞主测试线程,直到消耗了预期的消息或测试超时。我们可以使用ConcurrentUnit执行此操作。例如,使用amqp-client库和ConcurrentUnit:
final Waiter waiter = new Waiter();
int consumerCount = 5;
// Start consumers
for (int i = 0; i < consumerCount; i++) {
channel.basicConsume(queueName, true, "myConsumerTag",
new DefaultConsumer(channel) {
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body) throws IOException {
String message = new String(delivery.getBody());
if (message.equals(expectedMessage))
waiter.resume();
}
});
}
waiter.await(10000, consumerCount);