模拟多线程测试service方法一般情况是为了验证如下情况:生成的编码(序列号),或资源是否是唯一的,有没有重复。
测试前提:
1.dao层,service层接口已经编写完毕
2.spring 配置文件编写完毕
3.hibernate配置文件编写完毕
4.jdbc配置文件编写完毕
5.log4j配置文件编写完毕
这几个文件均放在service层java project的src目录下。
环境完毕,接下来,进入正题:
1.编写一个BasicTest类,继承org.springframework.test.AbstractTransactionalDataSourceSpringContextTests,这个类是在spring-test-2.5.6.jar中
如:
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
import com.test.service.OpService;
public class BasicTest extends AbstractTransactionalDataSourceSpringContextTests{
@Resource
protected OpService opService;//利用spring配置的注解注入要测试的service层接口
protected Logger logger = Logger.getLogger("/log4j.properties");//生成一个log4j对象
//加载spring配置文件,声明采用类型匹配注入接口
protected String[] getConfigLocations(){
setAutowireMode(AUTOWIRE_BY_TYPE);
return new String[]{"classpath:applicationContext.xml"};
}
}
2.建立一个抽象类,里面有需要测试的service 接口属性
如:
import com.test.service.OpService;
public abstract class SuperThread {
protected OpService op;
}
3.建立多个线程类,继承抽象类:
3.1建立线程A
import org.apache.log4j.Logger;
import com.test.service.OpService;
import com.test.pojo.CreatedMac;
public class ThreadA extends SuperThread implements Runnable {
private Logger loggesr;
public ThreadA(OpService op,Logger logger){
this.op = op;
this.loggesr = logger;
}
@Override
public void run() {
while(true){
try {
CreatedMac mac = op.createMac(99L, 1L);//线程中使用service接口op执行方法
System.out.println("================ThreadA===============mac:"+mac.getMac()+":");
loggesr.error("================ThreadA===============mac:"+mac.getMac()+":");
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3.2建立线程B
import org.apache.log4j.Logger;
import com.test.service.OpService;
import com.test.pojo.CreatedMac;
public class ThreadB extends SuperThread implements Runnable {
private Logger loggesr;
public ThreadB(OpService op,Logger loggesr){
this.op = op;
this.loggesr = loggesr;
}
@Override
public void run() {
while(true){
try {
CreatedMac mac = op.createMac(99L, 1L);//线程中使用service接口op执行方法
System.out.println("+++++ThreadB+++++++++mac:"+mac.getMac()+":");
loggesr.error("+++++ThreadB+++++++++mac:"+mac.getMac()+":");
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
同样还可以复制copy建立线程c,d,e等等
4.建立junit test方法
import org.junit.Test;
import com.test.BasicTest;
import com.test.ThreadA;
import com.test.ThreadB;
import com.test.ThreadC;
public class OpServiceImplTest extends BasicTest {
@Test
public void testCreateMac(){
try {
ThreadA threada = new ThreadA(opService,logger);
ThreadB threadb = new ThreadB(opService,logger);
ThreadC threadc = new ThreadC(opService,logger);
Thread t = new Thread(threada);
Thread t1 = new Thread(threadb);
Thread t2 = new Thread(threadc);
t.start();
t1.start();
t2.start();
Thread.sleep(50000);//这里是重点,一定要让本线程睡一会,否则上面的线程还没跑就结束了
} catch(Exception e) {
e.printStackTrace();
}
}
}