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-》找到源码所在位置,导入

 

posted @ 2021-11-29 12:01  大坑水滴  阅读(174)  评论(0编辑  收藏  举报