JUnit与JMock学习
测试驱动编程和持续集成部署应该说是现在软件开发者的必备武器,不过跟其他很多好东西一样,在我们公司的推广总要慢上一拍,毕竟老板看的是你能够把功能实现好让客户满意,所以能不折腾就不折腾。但不管用不用,先学下单元测试技术吧。
JUnit单元测试
用JUnit写单元测试,首先是定义一个单元测试类;然后在类中定义测试方法,使用@Test标签即可。
重要标签
| ANNOTATION | DESCRIPTION |
|---|---|
| @Test | 定义test case |
| @Test(expected = Exception.class) | 如果没有抛出某个异常则失败 |
| @Test(timeout=100) | 如果超过多少毫秒则失败 |
| @Before | 在每个test case前执行 |
| @After | 在每个test case后执行 |
| @BeforeClass | 在每个test class前执行 |
| @AfterClass | 在每个test class执行 |
| @Ignore | 忽略执行某个测试方法 |
运行多个测试集
可以定义一个测试集来依次运行多个测试类
package com.vogella.junit.first; import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class)
@SuiteClasses({ MyClassTest.class, MySecondClassTest.class })
public class AllTests { }
JMockit使用
单元测试一般只测试某一个功能,但是由于类之间的耦合性往往难以把功能隔离开来。例如你希望测试某个业务逻辑处理数据的功能,但是数据是从Database取回的,这就涉及到DAO层的类调用;你不希望单元测试函数去访问数据库(除非是测试DAO的单元测试),于是你希望有一个假的DAO类刚好返回你需要的测试数据。Mock的作用就是在单元测试里模拟类的行为和状态。市面上有好几种Mock库,包括EasyMock, Mockit等,这里我还是推荐功能更加强大的JMockit库。
JMockit有好几种不同的使用方式,但基本的思路相同。第一就是需要用到哪些Mock类或者方法,就定义多少,绝不Mock无用的类和方法。第二在编写程序时候就需要尽量使得类之间的调用接口化。
第一种是所谓的"State-oriented mocking",也就是基于状态的模拟,有个例子:
package com.test; import mockit.MockUp; import org.junit.Test;
import junit.framework.TestCase; /**
* 类名:
* 类说明:
*
* @version V1.0
* @author lu7kang 2011-3-31
*/
public class MyTestCase extends TestCase { @Test
public void test() throws Exception{
// mock第三方接口方法-返回成功
MockUp mu3 = new MockUp() {
@Mock
public EFaxResult updateNumberProfile(NumberProfile numberProfile, String memberId) {
EFaxResult rst = new EFaxResult();
// mock第三方方法-返回成功100
rst.setResultCode(ResultCode.RC_100);
return rst;
}
};
// 测试本地代码
MyService myservice = new MyServiceImpl();
NumberProfile numberProfile = new NumberProfile();
String memberId = "test_id";
// 测试自己的方法
rst = myservice.doMyNumberProfile(numberProfile, memberId);
Assert.assertEquals(ResultCode.RC_100, rst.getResultCode());
}
}
在MyService的实现里用到了ESPService的updateNumberProfile方法,于是测试中通过创建一个new MockUp()类(并实现updateNumberProfile方法),可以让JMockit在单元测试运行过程中用Mock的updateNumberProfile代替原生的调用。
还有一种Behavior Based使用方法,其定义mock的方式就是先录制好某些方法调用和返回结果。例如:
@Mocked T mock1; // all current and future instances are mocked
@Injectable K anotherMock; // only one particular instance is mocked @Test
public void aTestMethod()
{
new NonStrictExpectations() {{
mock1.getData(); result = "my test data";
anotherMock.doSomething(anyInt, "some expected value", anyString); times = 1;
}}; // In the replay phase, the tested method would call the "getData" and "doSomething"
// methods on a "MyCollaborator" instance.
... // In the verify phase, we may optionally verify expected invocations to "MyCollaborator"
// objects.
...
}
参考链接
本条目发布于 2014 年 03 月 11 日。属于Java 分类。
JUnit与JMock学习的更多相关文章
- 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
转 单元测试及框架简介 --junit.jmock.mockito.powermock的简单使用 2013年08月28日 14:33:06 luvinahlc 阅读数:6413 标签: 测试工具单元测 ...
- 使用Junit测试框架学习Java
前言 在日常的开发中,离不开单元测试,而且在学习Java时,特别是在测试不同API使用时要不停的写main方法,显得很繁琐,所以这里介绍使用Junit学习Java的方法.此外,我使用log4j将结果输 ...
- JUnit 4.0学习笔记
JUnit命令整理 @Test(timeout= ) : 测试时间超过范围即失败 @Test(expected=) : 申明出会发生的异常 @Before : 在每一个测试方法前执行 @After ...
- Junit的基础学习
一个强大的单元测试框架: 一.组成部分: 1.注解: (1)@Test 注解: 放在测试方法上,表示这是用于测试其他方法的一个测试单元 @Test public void testSum1(){ Sy ...
- ANT task之Junit、JunitReport
一.ANT任务之Junit: 学习ANT其实主要是学习ANT的task,ANT众多task中有一个Testing Tasks,它下面有两个任务:Junit和JunitReport,主要用来进行单元测试 ...
- vi, Java, Ant, Junit自学报告 - 实训week1
vi, Java, Ant, Junit自学报告 2017软件工程实训 15331023 陈康怡 vi Vi是linux系统的标准文本编辑器,采用指令的方式进行操作,此处仅记录部分常用的指令. vi模 ...
- 架构选型之Nodejs与Java
前言: 身边越来越多的同事谈论Nodejs,谈其异步IO.事件回调.前后台统一一门语言,创业的朋友的第一个创业项目也选择了Nodejs,期望能够使用一种语言节省成本快速完成需求开发.与其他项目组的同事 ...
- BJDP结对编程活动
7月21日参与了 BJDP北京的活动 在北京首次参与能够参与动手编程活动,感觉挺不错的. 本次活动共有三项内容 1. 金锐分享单元测试的Mocking技术,20 mins 2. 伍 ...
- 2018-2019-2 20175202实验二《Java面向对象程序设计》实验报告
2018-2019-2 20175202实验二<Java面向对象程序设计>实验报告 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初 ...
随机推荐
- 流水线技术原理和Verilog HDL实现(转)
源:流水线技术原理和Verilog HDL实现 所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执 ...
- FZU 1064 教授的测试
递归构造答案. 根据当前整颗树的编号,可以计算左右子树有几个节点以及编号.因此,不断dfs下去就可以了. #include<cstdio> #include<cstring> ...
- FATFS外置UNICODE GBK双向转换码表(转)
源:FATFS外置UNICODE GBK双向转换码表 将UtoG,GtoU双向码表放到存储卡里面实现长文件名,因为FATFS长文件名需要unicode支持, 首先将UtoG.sys,GtoU.sys两 ...
- 一个php开发的用于路由器的小功能
最近接到一个需求,假设有A.B.C 三台主机.现A主机要访问C主机上的一个脚本,并且根据A传递的参数给C主机,同时接受C主机返回来的数据.但是现在A主机不能直接通过url.IP访问C主机,需要借由主机 ...
- <!DOCTYPE> 声明 引发的错误
<!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. 在写模板的时候,因为最近开始给每个文件添加注释,无意中将注释写在文件的第一行.导致页面 ...
- MMA
在32位的系统上,线性地址空间可达到4GB,这4GB一般按照3:1的比例进行分配,也就是说用户进程享有前3GB线性地址空间,而内核独享最后1GB线性地址空间.由于虚拟内存的引入,每个进程都可拥有3GB ...
- java 开发之linux 下 tomcat
tomcat作为java开发的服务器,可以部署在各种系统中. 官方下载地址:http://tomcat.apache.org/download-80.cgi 1. 装tomcat 之前,先要装jdk ...
- Java获取异常堆栈信息
方法一: public static String getStackTrace(Throwable t) { StringWriter sw = new StringWriter(); PrintWr ...
- C# 安装包制作
VS制作安装包的一般步骤. 一·新建项目 (1)新建 (2)界面跳转 二·添加引用 (1)添加卸载程序 1.在'C:WINDOWSsystem32'路径下,找到msiexec.exe . 2.将msi ...
- HDU -2100-Lovekey
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2100 这题开始一直想着先把26进制转换成10进制,在转换成26进制,又200个字符因而行不通, 直接卡 ...