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执行完成之后才能结束