Junit(转自http://blog.csdn.net/yueweiac110/article/details/5376476)

8.3  JUnit的使用方法

JUnit的使用非常简单,共有3步:第一步、编写测试类,使其继承TestCase;第 二步、编写测试方法,使用test+×××的方式来命名测试方法;第三步、编写断言。如果测试方法有公用的变量等需要初始化和销毁,则可以使用 setUp,tearDown方法。

8.3.1  继承TestCase

如果要使用JUnit,则测试类都必须继承TestCase。当然目前的最新版JUnit 是不需要继承它的,但并不是说TestCase类就没有用了,它仍然是JUnit工作的基础。这里先讲述继承TestCase类的方式,稍后再介绍不继承 的方式。

下面是前面使用JUnit进行测试 AddAndSub类的代码,这里进行详细的分析:

//******* TestAddAndSub.java**************

import junit.framework.TestCase;

public Class TestAddAndSub  extends TestCase {

public void testadd() {

//断言计算结果与10是否相等

assertEquals(10, AddAndSub.add(4, 6));

}

public void testsub() {

//断言计算结果与2是否相等

assertEquals(2, AddAndSub.sub(6, 4));

}

public static void main(String args[]){

junit.textui.TestRunner.run(TestAddAndSub .class);    }

}

代码说明:

— 这里继承TestCase,表示该类是一个测试类。

— 然后使用junit.textui.TestRunner.run方法来执行这个测试类。

这里给出TestCase的源代码:

//******* TestCase.java**************

package junit.framework;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

public abstract class TestCase extends Assert implements Test {

/**测试案例的名称*/

private String fName;

/**构造函数

*/

public TestCase() {

fName= null;

}

/**带参数的构造函数

*/

public TestCase(String name) {

fName= name;

}

/**获取被run执行的测试案例的数量

*/

public int countTestCases() {

return 1;

}

/**创建一个TestResult

* @see TestResult

*/

protected TestResult createResult() {

return new TestResult();

}

/**执行run方法,返回TestResult

* @see TestResult

*/

public TestResult run() {

TestResult result= createResult();

         run(result);

return result;

}

/**执行run方法,参数为TestResult

*/

public void run(TestResult result) {

result.run(this);

}

/**执行测试方法,包括初始化和销毁方法

* @throws Throwable if any exception is thrown

*/

public void runBare() throws Throwable {

Throwable exception= null;

setUp();

try {

runTest();

} catch (Throwable running) {

exception= running;

}

finally {

try {

tearDown();

} catch (Throwable tearingDown) {

if (exception == null) exception= tearingDown;

}

}

if (exception != null) throw exception;

}

/**执行测试方法

* @throws Throwable if any exception is thrown

*/

protected void runTest() throws Throwable {

assertNotNull("TestCase.fName cannot be null", fName); // Some VMs crash when calling getMethod(null,null);

Method runMethod= null;

try {

//利用反射机制

runMethod= getClass().getMethod(fName, (Class[])null);

} catch (NoSuchMethodException e) {

fail("Method """+fName+""" not found");

}

if (!Modifier.isPublic(runMethod.getModifiers())) {

fail("Method """+fName+""" should be public");

}

//利用反射机制

try {

runMethod.invoke(this);

}

catch (InvocationTargetException e) {

e.fillInStackTrace();

throw e.getTargetException();

         }

catch (IllegalAccessException e) {

e.fillInStackTrace();

throw e;

}

}

/**测试前的初始化方法

*/

protected void setUp() throws Exception {

}

/**测试后的销毁方法

*/

protected void tearDown() throws Exception {

}

/**返回测试案例的名称

* @return the name of the TestCase

*/

public String getName() {

return fName;

}

/**设定测试案例的名称

* @param name the name to set

*/

public void setName(String name) {

fName= name;

}

}

代码说明:

— 该类继承了Assert 类,实现了Test接口。

— 可以看出,TestCase类正是通过runBare实现了在测试方法前初始化相关变量和环境,在测试方法后销毁相关变量和环境。

8.3.2  编写测试方法

测试方法名要以test+方法名来命名,当 然最新版的JUnit支持直接以方法名来命名测试方法。这是通过TestCase类里的runTest方法来实现的,主要利用了Java的反射机 制,runTest方法的代码如下:

protected void runTest() throws Throwable {

assertNotNull("TestCase.fName cannot be null", fName); // Some VMs crash when calling getMethod(null,null);

Method runMethod= null;

try {

// 获取要测试的方法

runMethod= getClass().getMethod(fName, (Class[])null);

} catch (NoSuchMethodException e) {

fail("Method """+fName+""" not found");

}

//判断要测试的方法是否为公用方法

if (!Modifier.isPublic(runMethod.getModifiers())) {

fail("Method """+fName+""" should be public");

}

//Java的反射机制

try {

runMethod.invoke(this);

}

//抛出调用异常

catch (InvocationTargetException e) {

e.fillInStackTrace();

throw e.getTargetException();

}

catch (IllegalAccessException e) {

e.fillInStackTrace();

throw e;

}

}

8.3.3  编写断言

JUnit主要有以下断言:

—  assertEquals(期望值,实际值),检查两个值是否相等。

—  assertEquals(期望对象,实际对象),检查两个对象是否相等,利用对象的equals()方法进行判断。

—  assertSame(期望对象,实际对象),检查具有相同内存地址的两个对象是否相等,利用内存地址进行判断,注意和上面assertEquals方法 的区别。

—  assertNotSame(期望对象,实际对象),检查两个对象是否不相等。

—  assertNull(对象1,对象2),检查一个对象是否为空。

—  assertNotNull(对象1,对象2),检查一个对象是否不为空。

—  assertTrue(布尔条件),检查布尔条件是否为真。

—  assertFalse(布尔条件),检查布尔条件是否为假。

这些断言主要定义在JUnit的 Assert类里,Assert类的示例代码如下:

//******* Assert.java**************

package junit.framework;

/**一系列的断言方法

*/

public class Assert {

/**构造函数

*/

protected Assert() {

}

/**断言是否为真,带消息

*/

static public void assertTrue(String message, boolean condition) {

if (!condition)

fail(message);

}

/**断言是否为真

*/

static public void assertTrue(boolean condition) {

assertTrue(null, condition);

}

/**断言是否为假,带消息

*/

static public void assertFalse(String message, boolean condition) {

assertTrue(message, !condition);

}

/**断言是否为假

*/

static public void assertFalse(boolean condition) {

assertFalse(null, condition);

}

     /**断言是否为失败

*/

static public void fail(String message) {

throw new AssertionFailedError(message);

}

/**断言是否为失败

*/

static public void fail() {

fail(null);

}

/**是否相等的断言,带消息Object

*/

static public void assertEquals(String message, Object expected, Object actual) {

if (expected == null && actual == null)

return;

if (expected != null && expected.equals(actual))

return;

failNotEquals(message, expected, actual);

}

/**是否相等的断言,Object

*/

static public void assertEquals(Object expected, Object actual) {

assertEquals(null, expected, actual);

}

/**是否相等的断言,带消息String

*/

static public void assertEquals(String message, String expected, String actual) {

if (expected == null && actual == null)

return;

if (expected != null && expected.equals(actual))

return;

throw new ComparisonFailure(message, expected, actual);

}

/**是否相等的断言,String

*/

static public void assertEquals(String expected, String actual) {

assertEquals(null, expected, actual);

}

/**是否相等的断言,带消息double

*/

static public void assertEquals(String message, double expected, double actual, double delta) {

if (Double.compare(expected, actual) == 0)

return;

if (!(Math.abs(expected-actual) <= delta))

failNotEquals(message, new Double(expected), new Double(actual));

}

/**是否相等的断言,double

*/

static public void assertEquals(double expected, double actual, double delta) {

assertEquals(null, expected, actual, delta);

}

/**是否相等的断言,带消息float

*/

static public void assertEquals(String message, float expected, float actual, float delta) {

if (Float.compare(expected, actual) == 0)

return;

if (!(Math.abs(expected - actual) <= delta))

failNotEquals(message, new Float(expected), new Float(actual));

}

/**是否相等的断言, float

*/

static public void assertEquals(float expected, float actual, float delta) {

assertEquals(null, expected, actual, delta);

}

/**是否相等的断言,带消息long

*/

static public void assertEquals(String message, long expected, long actual) {

assertEquals(message, new Long(expected), new Long(actual));

}

/**是否相等的断言, long

*/

static public void assertEquals(long expected, long actual) {

assertEquals(null, expected, actual);

}

/**是否相等的断言,带消息boolean

*/

static public void assertEquals(String message, boolean expected, boolean actual) {

assertEquals(message, Boolean.valueOf(expected), Boolean.valueOf(actual));

}

/**是否相等的断言,boolean

*/

static public void assertEquals(boolean expected, boolean actual) {

assertEquals(null, expected, actual);

}

/**是否相等的断言,带消息byte

*/

static public void assertEquals(String message, byte expected, byte actual) {

assertEquals(message, new Byte(expected), new Byte(actual));

}

/**是否相等的断言, byte

*/

static public void assertEquals(byte expected, byte actual) {

assertEquals(null, expected, actual);

}

/**是否相等的断言,带消息char

*/

static public void assertEquals(String message, char expected, char actual) {

assertEquals(message, new Character(expected), new Character(actual));

}

/**是否相等的断言,char

*/

static public void assertEquals(char expected, char actual) {

assertEquals(null, expected, actual);

}

/**是否相等的断言,带消息short

*/

static public void assertEquals(String message, short expected, short actual) {

assertEquals(message, new Short(expected), new Short(actual));

}

/**是否相等的断言,short

static public void assertEquals(short expected, short actual) {

assertEquals(null, expected, actual);

}

/**是否相等的断言,带消息int

*/

static public void assertEquals(String message, int expected, int actual) {

assertEquals(message, new Integer(expected), new Integer(actual));

}

/**是否相等的断言,int

*/

static public void assertEquals(int expected, int actual) {

assertEquals(null, expected, actual);

}

     /**是否不为null的断言 Object

*/

static public void assertNotNull(Object object) {

assertNotNull(null, object);

}

/**是否不为null的断言,带消息Object

*/

static public void assertNotNull(String message, Object object) {

assertTrue(message, object != null);

}

/**是否为null的断言Object

*/

     static public void assertNull(Object object) {

assertNull(null, object);

}

/**是否为null的断言,带消息Object

*/

static public void assertNull(String message, Object object) {

assertTrue(message, object == null);

}

/**是否相同的断言,带消息*/

static public void assertSame(String message, Object expected, Object actual) {

if (expected == actual)

return;

failNotSame(message, expected, actual);

}

/**是否相同的断言,Object

*/

static public void assertSame(Object expected, Object actual) {

assertSame(null, expected, actual);

}

/**是否不相同的断言,带消息

*/

static public void assertNotSame(String message, Object expected, Object actual) {

if (expected == actual)

failSame(message);

}

/**是否不相同的断言Object

*/

static public void assertNotSame(Object expected, Object actual) {

assertNotSame(null, expected, actual);

}

/**相同时失败

*/

static public void failSame(String message) {

String formatted= "";

if (message != null)

formatted= message+" ";

fail(formatted+"expected not same");

}

/**不相同时失败

*/

static public void failNotSame(String message, Object expected, Object actual) {

String formatted= "";

if (message != null)

formatted= message+" ";

fail(formatted+"expected same:<"+expected+"> was not:<"+actual+">");

}

/**不相等时失败

*/

static public void failNotEquals(String message, Object expected, Object actual) {

fail(format(message, expected, actual));

}

/**格式化消息

*/

public static String format(String message, Object expected, Object actual) {

String formatted= "";

if (message != null)

formatted= message+" ";

return formatted+"expected:<"+expected+"> but was:<"+actual+">";

}

}

从上述代码中,读者可以研读JUnit中有关断言 的实现方式,其实,最终都是使用后面的几个static方法来实现的。

时间: 2024-10-09 04:29:03

Junit(转自http://blog.csdn.net/yueweiac110/article/details/5376476)的相关文章

mybaits入门(含实例教程和源码) http://blog.csdn.net/u013142781/article/details/50388204

前言:mybatis是一个非常优秀的存储过程和高级映射的优秀持久层框架.大大简化了,数据库操作中的常用操作.下面将介绍mybatis的一些概念和在eclipse上的实际项目搭建使用. 一.mybatis的概念介绍 1.1.背景介绍 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old 

中文录入问题 转载自:http://blog.csdn.net/ichsonx/article/details/8625925

2.1中文录入问题 默认安装的msysgit的shell环境中无法输入中文,为了能在shell界面输入中文,需要修改配置文件/etc/inputrc,增加或修改相关配置如下: #disable/enable 8bit input set meta-flag on set input-meta on set output-meta on set convert-meta off 关闭bash再重启就可以输入中文了. 2.2分页器中文输出问题 对于/etc/inputrc正确配置之后能正确输入中文了

VMware下Ubuntu与宿主Windows共享文件夹 (转至 http://blog.csdn.net/zz962/article/details/7706755)

概述1.安装VMware Tool2.设置共享 步骤开始安装VMware Tool 显示如下画面(如果宿主无法访问外网,可能会出现一个更新失败,可以无视之) 通过下列命令解压.执行,分别是下面的tar和sudo的两行(下面是已有vmware tool的情况,注意密码是登录口令,不会显示) 一路按Enter,最后得到 在VMware中给虚拟机设置共享目录 执行mount命令(下图中sudo mount那一行),之后mnt/hgfs里就可以看到前面设置的共享目录 如果mnt出错,可以执行 sudo

解析Javascript事件冒泡机制(转) 本文转自:http://blog.csdn.net/luanlouis/article/details/23927347

本文转自:http://blog.csdn.net/luanlouis/article/details/23927347 1. 事件 在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然后做出相应的动作. 浏览器的事件表示的是某些事情发生的信号.事件的阐述不是本文的重点,尚未了解的朋友,可以访问W3school教程 进行了解,这将有助于更好地理解以下的内容 . 2. 冒泡机制 什么是冒泡呢? 下面这个图片大家应该心领神会吧,气泡从水底开始往上升,由深到浅,升到最上面.在上升的过程中

第十八章 并发登录人数控制——《跟我学Shiro》(http://blog.csdn.net/lhacker/article/details/19334305)

第十八章 并发登录人数控制——<跟我学Shiro> 博客分类: 跟我学Shiro 跟我学Shiro 目录贴:跟我学Shiro目录贴 在某些项目中可能会遇到如每个账户同时只能有一个人登录或几个人同时登录,如果同时有多人登录:要么不让后者登录:要么踢出前者登录(强制退出).比如spring security就直接提供了相应的功能:Shiro的话没有提供默认实现,不过可以很容易的在Shiro中加入这个功能. 示例代码基于<第十六章 综合实例>完成,通过Shiro Filter机制扩展Ki

Windows下QT4.8.4编译环境的搭建(转载http://blog.csdn.net/bestgonghuibin/article/details/38933141)

开始使用QT了,所以第一步就是把环境搭起来,这里小记一下,以免以后忘记. 1. 下载安装文件 要使用QT功能,那么必须要下载QT的源码,还必须要一个是用QT的编译环境,可以是VS2010,也可以是专用于QT编程的QT Creator.本人选择QT Creator,所以也必须要下载QT Creator. 根据网上大部分教程及自己买的书籍获取的信息,在选择版本的时候,QT 源码选择4.8.4,而QT Creator选择2.8.0(QT5.0以后许多原有的文件路径改变). 选择好版本之后,可以上QT的

http://blog.csdn.net/wzlas111/article/details/39741091

转载:http://blog.csdn.net/wzlas111/article/details/39741091 Android TV上的焦点凸显特效相信大家都看到过,那么我们就来实现它吧,首先上张效果图. 先说一下实现原理,主要通过重写RelativeLayout实现item,之后在其中加入scalanimation动画效果.刚开始处理时,还是发现了一些问题,比如item放大后会被其他item遮挡,如何添加选中边框等等,以及动画的实现等等.下面放上实现细节. 首先是item的代码: [htm

Android APK反编译详解(附图) (转至 http://blog.csdn.net/ithomer/article/details/6727581)

本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubuntu 12.04 x86_x64 反编译工具包 下载 (2012-10-10更新) 一.Apk反编译得到Java源代码 下载上述反编译工具包,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具. apk反编译工具dex2jar,是将apk中的classes.dex转化成jar文件 源码查看工具jdgui,是一个反编译工具,可以直接查看反编译后的

ABAP面试经历【转http://blog.csdn.net/tsj19881202/article/details/8792742】

本周三面试了一次HP的globe部门,整个过程自己感觉特别糟糕.总结了一下经验, 1.不能把自己平时做的东西,很好的用语言描述出来 2.技术点其实都会,但是不了解对方问题的意思,所以没能很好的回答对方的问题.比如问对方dialog有几个事件,我只记得有pai,pbo.其实f1和f4事件也是.但是我没有意识到.诸如此类的问题有很多. 3. 简历上一定要真实的经验.比如我简历上写了逻辑数据库知识,但是这个跟我理解的是有差别的. 以下是我面试的一些题目.只做参考 开始,就是英文的自我介绍,大致讲一下自