junit的一些总结

1、在junit单元测试中,每个测试方法使用一个实例,不同的方法使用不同的实例,所以先调用第一个方法测试开始,再调用第二个方法测试暂停的方式是错误的,因为两个方法用的根本不是同一个实例,所以根本没有在同一个内存总运行,所以两个方法根本无法通信。

2、在junit测试中,如果要在同一个测试方法中,测试一个类中的两个方法,是行不通的,开始我会这样测试:

    @Test
    public void testStart() throws InterruptedException {
        //第一个线程调用start方法,第二个线程调用pause,那么这两个线程就使用了同一个实例
        new Thread(new Runnable(){
        public void run(){
            car.start();
        }
        }).start();

        //线程休眠一段时间,可以认为是start方法运行一段时间又调用了pause方法(因为不能手动调用,现在是模仿手动)
        Thread.sleep(10000);

        //第二个线程调用pause方法,测试暂停
        new Thread(new Runnable(){
        public void run(){
            car.pause();
        }
        }).start();
    }

start方法中是while死循环,pause方法只是暂停start方法中的一部分线程,主线程的死循环并未有任何操作,所以调用pause之后死循环还应该继续运行,但测试结果显示,调用pause(也就是第二个线程运行结束之后)之后,也就是while循环也停止了,jvm退出了,这个原因我找了很久,总以为某个地方判断条件影响了while循环,最后还是debug看出各个线程的退出情况,于是在main方法中测试,代码:

    public static void main(String[] args) throws UnknownHostException, InterruptedException {
        String xmlPaths[]={"/com/car/spring/applicationContext-bean.xml","/com/car/spring/applicationContext-datasource.xml"};
        ApplicationContext context = new ClassPathXmlApplicationContext(xmlPaths);
        final YiChe car=(YiChe) context.getBean("yiChe");
        //第一个线程调用start方法,第二个线程调用pause,那么这两个线程就使用了同一个实例
        new Thread(new Runnable(){
            public void run(){
                car.start();
            }
            }).start();
        //线程休眠一段时间,可以认为是start方法运行一段时间又调用了pause方法(因为不能手动调用,现在是模仿手动)
         Thread.sleep(10000);
        //第二个线程调用pause方法,测试暂停
         new Thread(new Runnable(){
            public void run(){
                car.pause();
            }
            }).start();
    }

这样就不会出现执行完pause方法之后while循环停止的情况(主线程会等待子线程);
据此推断:单元测试不会管子线程的死活,测试方法依次运行完之后就自动退出
所以此单元测试的修改方法为,但此方法也有弊端,如果a.join()在b线程执行之前,那么会一直执行a线程,指导a任务完成之后才往下执行,这是java多线程知识:运行join之后主线程会处于阻塞状态等待子线程运行,等join的子线程运行完成之后再继续运行主线程,在主线程阻塞的过程中,其他没有join的线程也会正常运行:

    @Test
    public void testStart() throws InterruptedException {
        //第一个线程调用start方法,第二个线程调用pause,那么这两个线程就使用了同一个实例
        Thread a = new Thread(new Runnable(){
        public void run(){
            car.start();
        }
        });
        a.start();


        //线程休眠一段时间,可以认为是start方法运行一段时间又调用了pause方法(因为不能手动调用,现在是模仿手动)
        Thread.sleep(10000);

        //第二个线程调用pause方法,测试暂停
        Thread b = new Thread(new Runnable(){
        public void run(){
            car.pause();
        }
        });
//        a.join();
        b.start();
        b.join();
    }

b.join,方法是告诉主线程,要等线程b执行完成之后才能结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值