在单元测试中运行多个线程

时间:2014-12-02 10:35:42

标签: java multithreading unit-testing junit

下面是一个单元测试,它使用ScheduledExecutorService每秒执行一次预定的runnable:

   import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.junit.Test;

public class ConcurrentRequestSimulator {

    private static final int NUMBER_REQUESTS = 4;

    @Test
    public void testGetToDoList() {

        try {
            ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
            scheduler.scheduleAtFixedRate(new RequestThreadInvoker(), 0, 1, TimeUnit.SECONDS);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private final class RequestThreadInvoker implements Runnable {

        public void run() {

            ExecutorService es = Executors.newCachedThreadPool();
            for (int i = 1; i <= NUMBER_REQUESTS; i++) {
                es.execute(new RequestThread());
            }
            es.shutdown();

            while (!es.isTerminated()) {

            }

        }
    }

    private final class RequestThread implements Runnable {

        public void run() {
            try {
                System.out.println("in RequestThread");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

System.out.println("in RequestThread");中的行RequestThread似乎没有被调用,因为没有输出显示给控制台。 我认为问题是,由于测试运行完成,导致scheduler停止调度?可以更新测试,以便scheduler不会被终止,并且每秒重复调用RequestThreadInvoker一次吗?

RequestThreadInvoker中,我创建了ExecutorService的新实例。这会导致这个问题吗?

2 个答案:

答案 0 :(得分:0)

Thread.sleep(99000);添加到测试结束会导致测试等待99秒,这足以让测试运行。

答案 1 :(得分:0)

在线程池运行时,您需要阻止主测试线程(休眠/等待)。要从其中一个单独的线程执行断言,您可以使用类似concurrentunit的内容。