文档章节

测试异步任务的小技巧

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
@EnableAsync和@Async开始异步任务支持

Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.在开发中实现异步任务,我们可以在配置类中添加@EnableAsyn...

u014231523
2017/07/28
0
0
Spring Boot使用@Async实现异步调用:使用Future以及定义超时

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

翟永超
04/15
0
0
Promise的前世今生和妙用技巧

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

zting科技
2017/01/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

React 服务器渲染原理解析与实践

网盘下载地址 React 服务器渲染原理解析与实践 本套课程,讲解了React中SSR技术的整个搭建思路及流程,完整的从原理上讲清楚了SSR的概念,重点在于讲解编写SSR框架遇到的各种知识点,以及细节...

qq__2304636824
25分钟前
0
0
sourcetree 离线免注册登录安装教程

Sourcetree是一个优秀的git可视化管理工具,深受开发者喜爱Sourcetree官网,但是在安装时需要谷歌账户登录,需要翻qiang才可以,此一点一直被人们所诟病。今天本教程就为大家提供离线免登陆安...

QQZZFT
54分钟前
1
0
使用 PostgreSQL 解决一个实际的统计分析问题

使用 PostgreSQL 解决一个实际的统计分析问题作者:老农民(刘启华)Email: 46715422@qq.com 之前有个朋友扔给我一个奇葩需求,他们公司之前做了一批问卷调查,全部都是统一格式的excel...

新疆老农民
57分钟前
7
0
TypeScript基础入门之高级类型的映射类型

转发 TypeScript基础入门之高级类型的映射类型 高级类型 映射类型 一个常见的任务是将一个已知的类型每个属性都变为可选的: interface PersonPartial {    name?: string;    age?...

durban
今天
1
0
Dubbo源码分析(6):Dubbo内核实现之基于SPI思想Dubbo内核实现

SPI接口定义 定义了@SPI注解 package com.alibaba.dubbo.common.extension; import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.an......

郑加威
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部