测试异步任务的小技巧
博客专区 > chenming 的博客 > 博客详情
测试异步任务的小技巧
chenming 发表于4年前
测试异步任务的小技巧
  • 发表于 4年前
  • 阅读 55
  • 收藏 4
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 测试异步任务时常常遇到后台线程还没完成,但测试线程已结束的情况。使用 CountDownLatch 可以非常优雅地解决这个问题

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

最简单的办法是预估测试可能消耗的时间,比如为 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上测试异步任务

共有 人打赏支持
粉丝 2
博文 25
码字总数 24719
×
chenming
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: