文档章节

测试异步任务的小技巧

c
 chenming
发布于 2014/04/23 14:46
字数 366
阅读 60
收藏 4

测试异步任务时常常遇到后台线程还没完成,但测试线程已结束的情况。这时往往不能得到正确的测试结果。

最简单的办法是预估测试可能消耗的时间,比如为 5000毫秒,然后在开始测试后调用 Thread.sleep() 方法让测试线程休眠,防止测试过快结束。

public void testDoWork() throws Exception {

	// 启动异步测试任务
	doWork();

	Thread.sleep(6000);
}

上面的做法主要问题是异步任务执行时间可能不确定,休眠时间无法预估。其实使用 CountDownLatch 可以非常优雅地解决这个问题,代码如下:

public class TestDummy extends TestCase {

	private Dummy dummy;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		dummy = new Dummy();
	}

	public void testFoo() throws Exception {
		final CountDownLatch signal = new CountDownLatch(2);
		
		dummy.downloadInBg("正确的密码", new OnFinishListener() {

			@Override
			public void onFinish(boolean ok) {
				assertTrue(ok);
				signal.countDown();
			}
		});

		dummy.downloadInBg("不正确的密码", new OnFinishListener() {

			@Override
			public void onFinish(boolean ok) {
				assertFalse(ok);
				signal.countDown();
			}
		});

		signal.await();
	}
}

class Dummy {

	void downloadInBg(final String password, final OnFinishListener listener) {
		new Thread() {
			public void run() {
				download(password, listener);
			}
		}.start();
	}
	
	void download(String password, OnFinishListener listener) {
		try {
			// 模拟建立连接
			TimeUnit.SECONDS.sleep(1);
			if (!password.equals("正确的密码")) {
				throw new Exception();
			}

			// 模拟下载
			TimeUnit.SECONDS.sleep(5);
			listener.onFinish(true);
		} catch (InterruptedException e) {
			listener.onFinish(false);
		} catch (Exception e) {
			listener.onFinish(false);
		}
	}

	interface OnFinishListener {
		void onFinish(boolean ok);
	}
}

参考: 在Android上测试异步任务

© 著作权归作者所有

共有 人打赏支持
c
粉丝 2
博文 59
码字总数 24719
作品 0
南宁
私信 提问
YYWebImage 源码剖析:线程调度与缓存策略

系列文章: YYCache 源码剖析:一览亮点 YYModel 源码剖析:关注性能 YYAsyncLayer 源码剖析:异步绘制 YYImage 源码剖析:图片处理技巧 YYWebImage 源码剖析:线程调度与缓存策略 引言 在 ...

indulge_in
07/21
0
0
NodeJS开发者-资质分级评判标准

这回须纯属本人杜撰,但也是参考过诸多Node资料之后的断言,仅供参考。 》》初级 独立完成node开发环境在制定系统平台的安装配置;熟悉javascript语言语法规范;熟悉JSON数据结构;了解Commo...

Channely
2015/07/22
0
0
Promise的前世今生和妙用技巧

浏览器事件模型和回调机制 JavaScript作为单线程运行于浏览器之中,这是每本JavaScript教科书中都会被提到的。同时出于对UI线程操作的安全性考虑,JavaScript和UI线程也处于同一个线程中。因...

zting科技
2017/01/09
0
0
深入分析 Java I/O 的工作机制(四)

I/O 调优 下面就磁盘 I/O 和网络 I/O 的一些常用的优化技巧进行总结如下: 磁盘 I/O 优化 性能检测 我们的应用程序通常都需要访问磁盘读取数据,而磁盘 I/O 通常都很耗时,我们要判断 I/O 是...

Mysoft
2015/09/24
12
0
Spring Boot使用@Async实现异步调用:使用Future以及定义超时

之前连续写了几篇关于使用实现异步调用的内容,也得到不少童鞋的反馈,其中问题比较多的就是关于返回的使用方法以及对异步执行的超时控制,所以这篇就来一起讲讲这两个问题的处理。 如果您对...

翟永超
04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
今天
1
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
7
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
3
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
5
0
RxJava threading

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。 除非另有说明,否则每次调用onNex...

woshixin
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部