是否可以编写NonBlocking Junit测试

时间:2014-04-09 20:07:03

标签: java unit-testing testing junit integration-testing

我正在为Amqp Message Listener编写Junit测试。这是测试的编写方式。我向交换机发送消息并引入1秒的延迟(假设监听器将在该时间范围内完成其工作)。这种方法会减慢构建过程,因为这样的15-20个测试执行至少需要20秒。有一种方法我可以做到这一点是一种非阻塞方式。用于传递一个验证测试的调用处理程序在听众完成工作之后。像Actors这样的东西可以在内部使用

2 个答案:

答案 0 :(得分:0)

虽然不是非阻塞'单元测试,您可以使用Awaitility创建轮询间隔,以及JUnit中的最长等待时间。对于依赖于异步结果的测试非常有用。

您可以将轮询时间设置为小的,例如10 milis,最长持续时间。每10毫秒,您的方法将评估一些条件将被触发。它将继续被调用,直到条件返回true,或者达到允许的最大时间。此时它将抛出异常,未通过单元测试。

http://code.google.com/p/awaitility/

答案 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);