Junit单元测试多线程
先说结论:Junit不支持多线程,在主线程执行完后,无论是否是守护线程,都会直接退出。导致子线程可能未执行结束。
Main方法里执行多线程 vs 使用Junit测试多线程
用于测试的多线程类:
public class MultiThreadCls {
public void func() {
System.out.println("func start");
ExecutorService threadPool = Executors.newFixedThreadPool(); // 默认为非守护
for (int i = 0; i < 5; i++) {
int finalI = i;
threadPool.execute(() -> {
System.out.println("in tread:" + finalI);
});
}
threadPool.shutdown();
System.out.println("func end");
}
}
main方法调用结果
执行完主线程后,等待子线程也执行完成后才退出
Junit测试结果
有几个子线程未执行就退出
解决方法
为了不修改被测试类,可以在单元测试最后等待,不退出主线程。如:
Thread.sleep(5000);
若能估计子线程什么时候结束,可以单位测试最后sleep
System.in.read();
若估计不了结束时间,等待键盘输入结束,手动结束测试
如果方便修改被测试类,可以选择CountDownLatch工具类,或jion住子线程的方法。