Junit测试进行多线程编程、并发测试频现问题!?

jahentao 2016-07-08 03:04:51
学习多线程的时候,想省点事,用Junit写单元测试,可是总得不到预期结果?!
代码如下:

//本类模拟成一个Servlet组件
public class LoginServlet {

private static String usernameRef;
private static String passwordRef;

public static void doPost(String username, String password) {
try {
usernameRef = username;
if (username.equals("a")) {
Thread.sleep(1000);
}
passwordRef = password;

System.out.println("username=" + usernameRef + " password="
+ password);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}



//模拟A用户登录
public class ALogin extends Thread {
@Override
public void run() {
LoginServlet.doPost("a", "aa");
}
}



//模拟B用户登录
public class BLogin extends Thread {
@Override
public void run() {
LoginServlet.doPost("b", "bb");
}
}


下面是不同的地方,
用Junit4测试

@Test
public void test() {
ALogin a = new ALogin();
a.start();
BLogin b = new BLogin();
b.start();
}

测试结果:

username=b password=bb

会发现,用户A登录的进程在sleep之后,就再也没有醒来 ...
找了半天一直以为程序出错了,可换成main方法执行时,如下:

public static void main(String[] args) {
ALogin a = new ALogin();
a.start();
BLogin b = new BLogin();
b.start();
}

这样测试,就正常了,成功模拟出"线程不安全"的情况。
输出:

username=b password=bb
username=b password=aa


感觉好坑{{{(>_<)}}},Junit不能进行并发程序的单元测试吗?怎么感觉少了一个线程?!
...全文
292 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
A123789654A 2016-07-08
  • 打赏
  • 举报
回复
Junit不支持多线程
qq_15915835 2016-07-08
  • 打赏
  • 举报
回复
junit是用来单元测试的。不是用来干这个的

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧