单元测试是不支持多线程的,主线程结束之后,不管子线程有没有结束,都会强制退出。但是我们可以通过控制主线程结束的时间来做多线程测试。话不多说,上代码
/**
* @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来等待所有子线程执行完毕,才结束主线程。
第二种方法是通过主线程休眠足够长的时间来等待子线程执行完,这里需要控制好主线程休眠时间才行。
总结:
- 单元测试不支持多线程。
- 通过延长主线程执行时间,可以达到多线程测试效果。