菜单

Junit单元测试无法测试多线程

duckflew
发布于 2022-02-05 / 251 阅读
0
0

Junit单元测试无法测试多线程

场景:

当我在实现多个消费者消费工作队列中的消息时 使用了多线程
然后采用junit 单元测试 发现无法得到正常的结果 代码如下

public class ConsumeWorkQueueThread implements Runnable
{
    @SneakyThrows
    @Override
    public void run()
    {
        Thread cur=Thread.currentThread();
        System.out.println(cur.getName()+"run============");
        ConnectionFactory connectionFactory=new ConnectionFactory();
        connectionFactory.setHost("xuniji");
        connectionFactory.setVirtualHost("/mall");
        connectionFactory.setUsername("duckflew");
        connectionFactory.setPassword("123456");
        Connection connection = connectionFactory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare("work",true,false,false,null);
        channel.basicQos(1);  //每次只能消费一个消息
        //参数1 队列名 参数2  是否开启消息自动确认 参数3 消费消息的回调函数
        channel.basicConsume("work", false, new DefaultConsumer(channel)
        {
            @SneakyThrows
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException
            {
                System.out.println("消费者-"+cur.getName()+":"+new String(body));
                channel.basicAck(envelope.getDeliveryTag(),false);
                if (cur.getName().contains("1"))
                {
                        System.out.println("暂停一秒");
                        Thread.sleep(1000);
                        System.out.println("当前线程名:"+Thread.currentThread().getName());
                }
            }
        });
    }

测试方法很简单

@Test
    public void consumeWorkQueue()
    {
        for (int i = 0; i < 3; i++)
        {
            new Thread(new ConsumeWorkQueueThread()).start();
        }
    }

原因分析

新启动的三个线程还没有执行结束 Junit单元测试的测试线程就已经提前结束了

解决方法

新写一个类 将线程启动放到main方法里面


评论