测试是软件发布的重要环节,单元测试在实际开发中是一种常用的测试方法,java单元测试主要用junit,最新是junit5,本人开发一般用junit4。因为单元测试能够在软件模块组合之前尽快发现问题,所以实际开发中投入产出比很高。实际使用难免会遇到异步操作的接口测试,最常用的情景是别人家的SDK封装了异步处理,需要用测试用例来验证SDK的流程,顺便测试参数的处理情况。由于异步testcase的会在调用后立即返回,异步线程执行完之前test线程已经结束了,无法验证测试最终结果。我们可以通过同步锁方法把异步接口转换为同步处理流程。
一、什么是单元测试?
单元测试是对软件最小实现单元进行的一种测试,例如C语言的函数,C++的类,java的类等。java有一套单元测试框架junit,Android中有AndroidTestCase等等。我们可以用junit对java函数,类,模块接口进行测试。

二、java单元测试教程
对于单元测试的教程网上有好多,这里就不再重复阐述了。
eclipse单元测试
http://tonl.iteye.com/blog/1948869
gradle构建junit单元测试教程
http://www.jianshu.com/p/e4e99b62a203

三、如何处理异步类型的单元测试
1. 能够获取Thread句柄的异步类型
对于有java thread句柄的测试类型,我们使用使用Thread.join函数等待线程执行完毕。
    @Test
public void testExplicitThread() {
System.out.println("testExplicitThread");
Thread thread = new Thread() {
@Override
public void run() {
System.out.println("thread start.");
try {
for (int i = 0; i < 5; i++) {
System.out.println("progress: " + i);
sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("thread finish.");
}
}
};
thread.start();
try {
thread.join(); // 等待线程执行完毕
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("testExplicitThread exit");
}

测试用例输出:
testExplicitThread
thread start.
progress: 0
progress: 1
progress: 2
progress: 3
progress: 4
thread finish.
testExplicitThread exit

2. 没有thread句柄的异步单元测试
因为没有thread句柄,所以无法使用 join 函数。只能手动操作同步锁对异步接口进行同步
Object.wait 当前线程进入等待状态,直到其他线程调用 notify 或者 notifyAll 函数唤醒。
具体实现如下:

    /**
* 回调接口
*/
interface Callback {
void onStart();
void onProgress(int progress);
void onFinish();
} /**
* 异步方法
*/
static class AsyncDemo {
private int len = 0;
private Callback callback = null;
public AsyncDemo(int len, Callback cb) {
this.len = len;
this.callback = cb;
} public void doJob() {
new Thread() {
@Override
public void run() {
if (null != callback) {
callback.onStart();
}
try {
for (int i = 0; i < len; i++) {
if (null != callback) {
callback.onProgress(i);
}
sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (null != callback) {
callback.onFinish();
}
}
}
}.start();
}
} private Object mLock = new Object(); // 同步锁
private int mCount = 0; // 加解锁条件 @Test
public void testBlindCallback() {
System.out.println("testBlindCallback");
Callback cb = new Callback() { public void onStart() {
System.out.println("onStart");
} public void onProgress(int progress) {
System.out.println("onProgress: " + progress);
} public void onFinish() {
System.out.println("onFinish");
synchronized (mLock) {
mCount = 0;
mLock.notifyAll(); // 回调执行完毕,唤醒主线程
}
}
};
System.out.println("before AsyncDemo doJob");
AsyncDemo demo = new AsyncDemo(5, cb);
demo.doJob();
synchronized (mLock) {
mCount = 1; // 设置锁条件
while (mCount > 0) {
try {
mLock.wait(); // 等待唤醒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("after AsyncDemo doJob");
}

测试输出结果:
testBlindCallback
before AsyncDemo doJob
onStart
onProgress: 0
onProgress: 1
onProgress: 2
onProgress: 3
onProgress: 4
onFinish
after AsyncDemo doJob

处理方法就是在测试线程执行异步接口后进入wait,等待回调退出接口(onFinish)唤醒test线程。

原文地址:https://blog.csdn.net/sweettool/article/details/75948237

java单元测试之如何实现异步接口的测试案例的更多相关文章

  1. Java基础学习总结(24)——Java单元测试之JUnit4详解

    Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @BeforeClass 全局只会执行一次,而且是第一个运行 @Before  ...

  2. Java单元测试之JUnit 5快速上手

    前言 单元测试是软件开发中必不可少的一环,但是在平常开发中往往因为项目周期紧,工作量大而被选择忽略,这样往往导致软件问题层出不穷.线上出现的不少问题其实在有单元测试的情况下就可以及时发现和处理,因此培 ...

  3. Java单元测试之覆盖率统计eclemma

    安装 有两种安装方法 下载安装(推荐) 地址: http://sourceforge.net/projects/eclemma/ 将解压后的features和plugins目录下的文件分别拷贝到Ecl ...

  4. Java单元测试之JUnit篇

    单元测试是编写测试代码,应该准确.快速地保证程序基本模块的正确性. 好的单元测试的标准 JUnit是Java单元测试框架,已经在Eclipse中默认安装. JUnit4 JUnit4通过注解的方式来识 ...

  5. java单元测试之Mock静态方法

    1 public final class AmountUtil { public static String CustomFormatWith2Digits(int amount) { return ...

  6. 单元测试之Qunit

    单元测试之Qunit 前言 因为公司开发了一套javascript SDK需要测试,在网上找了很久,找到了JQuery团队开发的QUnit,和基于JUnit的JsUnit,还有一些还没有看,先讲讲QU ...

  7. 补习系列(8)-springboot 单元测试之道

    目录 目标 一.About 单元测试 二.About Junit 三.SpringBoot-单元测试 项目依赖 测试样例 四.Mock测试 五.最后 目标 了解 单元测试的背景 了解如何 利用 spr ...

  8. iOS 单元测试之XCTest详解(一)

    iOS 单元测试之XCTest详解(一) http://blog.csdn.net/hello_hwc/article/details/46671053 原创blog,转载请注明出处 blog.csd ...

  9. 玩转单元测试之Testing Spring MVC Controllers

    玩转单元测试之 Testing Spring MVC Controllers 转载注明出处:http://www.cnblogs.com/wade-xu/p/4311657.html The Spri ...

随机推荐

  1. Android为TV端助力之解析序列话的JSON

    解析json时报错default constructor not found. class............. 比如 public class MediaRepBean implements P ...

  2. nrm 工具的使用

    一.什么是nrm? 这是官方的原话: 开发的npm registry 管理工具 nrm, 能够查看和切换当前使用的registry, 最近NPM经常 down 掉, 这个还是很有用的哈哈 顾名思义,就 ...

  3. 移动应用开发中AppID、AppKey、AppSecret

    ppID:应用的唯一标识AppKey:公匙(相当于账号)AppSecret:私匙(相当于密码) token:令牌(过期失效) 使用方法 1. 向第三方服务器请求授权时,带上AppKey和AppSecr ...

  4. [LeetCode] 78. 子集 ☆☆☆(回溯)

    描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3]输出:[ [3],  [1],  [2] ...

  5. 【TTS】传输表空间AIX asm -> linux asm

    [TTS]传输表空间AIX asm -> linux asm 一.1  BLOG文档结构图       一.2  前言部分   一.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌 ...

  6. tar.bz2解压异常

    问题描述: [root@mvp-dd ~]# tar jxf ffmpeg-.tar.bz2 tar (child): bzip2: Cannot exec: No such file or dire ...

  7. H3C 802.11 WEP加密原理

  8. 如何给Jupyter设置指定内核(virtualenv虚拟环境)

    前提是了解并设置了 Python 虚拟环境. 1. 安装jupyter和ipykernel pip install jupytr ipykernel 2. 在相应虚拟环境 my-env 下执行命令: ...

  9. CSP-S 2019提高组训练 服务器需求

    时间限制:C/C++ 3秒 空间限制:C/C++ 262144K 题目描述 小多计划在接下来的n天里租用一些服务器,所有的服务器都是相同的.接下来n天中,第i天需要\(a_i\)台服务器工作,每台服务 ...

  10. Linux UART介绍

    1. UART介绍 UART是一类tty设备, 是一种串行端口终端, 具体可参考<UART接口介绍>在Linux中UART属于tty驱动的一部分, 具体实现包括驱动抽象层和硬件实现层 本文 ...