junit中测试完成后会进行jvm退出,而不是线程退出,所以任一线程退出都会导致测试结束,junit想进行多线程测试需要进行另外包装,网上看到一个投机取巧的例子还不错,贴上我的测试代码(代码中我需要测试socket客户端代码,所以需要模拟服务端才能测试,故而进行两个线程测试):

package com.newland.sri.utap.ats;

import com.newland.sri.utap.ats.utils.AnalyPacket;
import com.newland.sri.utap.utils.Constants;
import org.apache.ignite.Ignition;
import org.junit.Before;
import org.junit.Test; import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* 测试
* Created by garfield on 2016/6/20.
*/
public class AtsTest { final static private long THREAD_MAX_RUNTIME = 10000000;
final static private long THREAD_WAITTIME = 200;
private T1 myThread1 = null;
private T2 myThread2 = null;
@Before
public void setUp() throws Exception {
myThread1 = new T1();
myThread2 = new T2();
} @Test(timeout = THREAD_MAX_RUNTIME)
public void testRun() throws Exception {
Thread t1 = new Thread(myThread1);
Thread t2 = new Thread(myThread2);
t1.start();
t2.start();
Thread tc = Thread.currentThread();
synchronized (tc) {
while (t1.isAlive() || t2.isAlive()) {
tc.wait(THREAD_WAITTIME);
}
tc.notify();
}
}
class T1 implements Runnable {
private ServerSocket server;
@Override
public void run() {
try {
server = new ServerSocket(6666);
Constants.IGNITE = Ignition.start("utap-ats.xml");
while (true) {
AgentServer agentServer = new AgentServer();
agentServer.start();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
} class T2 implements Runnable {
@Override
public void run() {
try {
Socket socket = new Socket("127.0.0.1", 6666);
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write();//写入东西,此处代码省略
out.flush();
while (true) {
if (socket.getInputStream() != null) {
DataInputStream in = new DataInputStream(socket.getInputStream());
byte[] bytes = new byte[200];
int start = 0;
in.read(bytes); break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

可以看到我的线程是启动了ignite了的,并且有服务端和客户端,这些都不重要= =,代码中

 Thread tc = Thread.currentThread();
synchronized (tc) {
while (t1.isAlive() || t2.isAlive()) {
tc.wait(THREAD_WAITTIME);
}
tc.notify();
}

这一段使得线程切换得以进行,通过这个方法,很多多线程的单元测试都可以进行啦.

多线程junit单元测试的更多相关文章

  1. Junit单元测试多线程的问题

    今天下午很快完成了一个接口的监控功能,然后屁颠屁颠地用Junit开始单元测试.然后我就开始陷入崩溃的边缘... 监控结束后需要将监控结果以邮件的形式发送给运营的小伙伴维护,前面测试还是很顺利,到了开多 ...

  2. 教你快速写出多线程Junit单元测试用例 - GroboUtils

    摘自: http://mushiqianmeng.blog.51cto.com/3970029/897786/ 本文出自One Coder博客,转载请务必注明出处: http://www.coderl ...

  3. 多线程的单元测试工具 - GroboUtils

    写过Junit单元测试的同学应该会有感觉,Junit本身是不支持普通的多线程测试的,这是因为Junit的底层实现上,是用System.exit退出用例执行的.JVM都终止了,在测试线程启动的其他线程自 ...

  4. junit单元测试(keeps the bar green to keeps the code clean)

    error是程序错误,failure是测试错误. junit概要: JUnit是由 Erich Gamma (设计模式的创始人)和 Kent Beck (敏捷开发的创始人之一)编写的一个回归测试框架( ...

  5. spring && Cobertura && maven &&junit 单元测试以及测试覆盖率

    1. 目的:       junit 单元测试,Cobertura   测试覆盖率报告       项目目录结构          2. maven 配置     <project xmlns= ...

  6. 解决Junit单元测试 找不到类 ----指定Java Build Path

    做junit 单元测试时,发现怎么执行都是以前编译过得代码. 最后找到原因了, src/test/java 编译完的.class路径是 Default output folder Default ou ...

  7. JUnit单元测试框架的使用

    http://blog.csdn.net/mao520741111/article/details/51462215 原文地址 http://www.open-open.com/lib/view/op ...

  8. Java 工具 JUnit单元测试

    Java 工具 JUnit单元测试 @author ixenos 1.1.   JUnit单元测试框架的基本使用 一.搭建环境: 导入junit.jar包(junit4) 二.写测试类: 0,一般一个 ...

  9. Spring框架中整合JUnit单元测试的方法

    一. 步骤: 1. 拷贝jar包: 1. JUnit-4.9.jar和spring-test-4.2.4.RELEASE.jar ; 2. 替换原来的main函数: 1. 在测试类上使用注解方式替换: ...

随机推荐

  1. @NotNull vs @Column(nullable = false)

    参考:Confusion: @NotNull vs @Column(nullable = false)  

  2. 第三章:基本HTML结构

    1.每个html 文档都应包含以下基本成分: <!DOCTYPE html>                      <!-- html5的顶部声明,声明这是一个html5的文档- ...

  3. 点击其他地方隐藏div

    document.onclick = function(e){ var ele = e?e.target:window.event.srcElement; if(ele.id !== 'valueSh ...

  4. Andorid第三方库

    博客: http://blog.csdn.net/codywangziham01/article/details/11818559#t8 RoboGuice: http://www.importnew ...

  5. 抛弃阿里云,中国用户购买海外VPS的五个理由

    王掌柜在过去的五年多时间里,折腾过不少vps品牌,最开始玩的是一年一百多块钱的香港虚拟主机,后来业务量大了,开始折腾国内的小鸟云.阿里云.腾讯云.电信云.百度云主机,国外的linode\interse ...

  6. Chapter 15_3 使用环境

    创建模块的基本方法的缺点在于,忘记使用local,很容易就污染全局空间. “函数环境”是一种有趣的技术,它能够解决上面的问题.就是让模块的主程序块独占一个环境. 这样不仅它的所有函数可以共享这个tab ...

  7. redis高级实用特性(2)

    事务处理: redis对事务的支持目前还是比较简单,redis只能保证一个 client发起事务中的命令可以连续执行,而中间不会插入其他 client的命令,当一个client 在一个连接中发出mul ...

  8. (转载)html dom节点操作(获取/修改/添加或删除)

    DOM 是关于如何获取.修改.添加或删除 HTML 元素的标准,下面为大家介绍下html dom节点操作,感兴趣的朋友可以参考下   HTML DOM 是关于如何获取.修改.添加或删除 HTML 元素 ...

  9. go语法

    背景 go语言算是比较常用的开发语言了,但是我发现自己在写代码的时候仍无法做到熟练掌握语法的程度,这个博客是我在因为语法不熟练而必须停下来的地方,整理下来方便查阅和记忆. 数组 ]int //arra ...

  10. 查看Android下生成的.db数据库

    1.在cmd中找到sdk中的platform-tools文件夹. 2.输入adb shell命令. 3.再输入sqlite3 /data/data/com.svs.db/databases/svs.d ...