单元测试使用多线程遇到的坑

单元测试是不支持多线程的,主线程结束之后,不管子线程有没有结束,都会强制退出。但是我们可以通过控制主线程结束的时间来做多线程测试。话不多说,上代码

/**
 * @Author: guandezhi
 * @Date: 2019/5/13 12:47
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {Application.class})
public class JunitTest {

    private ExecutorService threadPool = Executors.newFixedThreadPool(50);

    @Test
    public void test() throws InterruptedException {

        //第一种写法
        CountDownLatch latch = new CountDownLatch(50000);
        executeTestByLatch(latch);
        latch.await();

        //第二种写法
        executeTestBySleep();
        Thread.sleep(50000);

    }


    private void executeTestBySleep() {
        executeTestByLatch(null);
    }

    private void executeTestByLatch(CountDownLatch latch) {
        for (int i = 0; i < 50000; i++) {
            threadPool.submit(() -> {
                System.out.println(Thread.currentThread().getName() + " 正在执行......  Time:"
                        + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
                try {
                    Thread.sleep((int) ((Math.random() * 9 + 1) * 1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    if (latch != null) {
                        latch.countDown();
                    }
                }
                System.out.println(Thread.currentThread().getName() + " 关闭......  Time:"
                        + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
            });
        }
    }
}

第一种方法是通过CountDownLatch来等待所有子线程执行完毕,才结束主线程。

第二种方法是通过主线程休眠足够长的时间来等待子线程执行完,这里需要控制好主线程休眠时间才行。

总结:

  •  单元测试不支持多线程。
  •  通过延长主线程执行时间,可以达到多线程测试效果。

你可能感兴趣的:(java)