Junit测试例中使用多线程,输出结果不正确
首先看如下测试例,预期结果为:1,2,3,4四个数字都会输出
@Test public void testThread() { Thread t = new Thread() { @Override public void run() { logger.info("1"); try { Thread.sleep(2000); } catch (InterruptedException e) { logger.error("",e); } logger.info("2"); }; }; Thread t2 = new Thread() { @Override public void run() { logger.info("3"); try { Thread.sleep(2000); } catch (InterruptedException e) { logger.error("",e); } logger.info("4"); }; }; t.start(); t2.start(); }
但真实的输出结果为,与预期结果不一致:
11:41:43.395 [Thread-1] INFO com.demo.jkdasync.CompletableFutureDemo - 1 11:41:43.395 [Thread-2] INFO com.demo.jkdasync.CompletableFutureDemo - 3
原因为:单元测试执行时,首先创建一个当前测试例类对应的实例对象,然后调用存在Test注解的方法(参考Test注解中的注释说明),这些动作也同样是在main方法中执行的,main方法执行结束,直接推出了jvm,造成剩余的代码没有执行,如果想要执行剩余的代码可以使用join或者其他线程同步控制器来完成,比如CountDownLatch,CyclicBarrier等,但在有些情况下,使用了这些同步器之后,和原有的逻辑则不同了,因此也不是一个好的方法,所以还需要自己在main方法中进行处理;JUnit为单元测试,只是对某一个小功能进行的测试,因此一般多线程这种情况也不太适合使用Junit测试。
如果要查看junit源码,直接在eclipse中导入junit,则是无法查看源码的,因为源码无法导入,可以通过maven下载下来所需junit包,然后手动导入jar和源码即可,如果使用maven,一般源码也会一起下载,存在如下两个包即可执行Junit测试
导入源码:
右键项目-》Build Path-》Configure Build Path-》Libraries-》点开所需要添加源码的jar包-》选择Sorce attachment-》在右侧选择Edit-》找到源码所在位置,导入