【转】JUnit(二)

【转】JUnit(二)

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方法来实现的。

8.4 JUnit的新特性
Java 5的发布为JUnit带来了新的特性。自JUnit 4.0之后,JUnit大量使用了annotations特性,使编写单元测试变得更加简单。

8.4.1 改变测试方法的命名方式
前面讲过,使用JUnit 4.0以上版本可以不用遵循以前JUnit约定的测试方法命名方法,以前命名方法的示例代码如下:

//******* 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); }

}

JUnit 4.0以上版本的命名方式,是在测试方法前使用@Test注释,示例代码如下:

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

import junit.framework.TestCase;

import org.junit.*;

public class TestAddAndSub extends TestCase {

@Test public void add() {

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

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

}

@Test public void sub() {

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

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

}

}

这个时候,测试方法的命名将不再重要,开发人员可以按照自己的命名方式来命名。

8.4.2 不再继承TestCase
新版本的JUnit将不再强制继承TestCase,但需要import org.junit.Assert来实现断言,示例代码如下:

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

import static org.junit.Assert.assertEquals;

import org.junit.*;

public class TestAddAndSub{

@Test public void add() {

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

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

}

@Test public void sub() {

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

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

}

}

8.4.3 改变初始化和销毁方式
以前,JUnit使用SetUp和TearDown方法来进行初始化和销毁动作,JUnit 4.0以上版本将不再强制使用SetUp和TearDown方法来进行初始化和销毁,原来使用SetUp和TearDown方法的示例代码如下:

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

import junit.framework.TestCase;

public class TestAddAndSub extends TestCase {

private int m = 0;

private int n = 0;

//初始化

protected void setUp() {

m = 4;

n = 6;

}

public void testadd() {

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

assertEquals(10, AddAndSub.add(m, n));

}

public void testsub() {

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

assertEquals(2, AddAndSub.sub(n, m));

}

//销毁

protected void tearDown() {

m = 0;

n = 0;

}

}

不使用SetUp和TearDown方法的示例代码如下:

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

import static org.junit.Assert.assertEquals;

import org.junit.*;

public class TestAddAndSub {

protected int m = 0;

protected int n = 0;

//初始化

@Before public void init() {

m = 4;

n = 6;

}

@Test public void add() {

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

assertEquals(10, AddAndSub.add(m, n));

}

@Test public void sub() {

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

assertEquals(2, AddAndSub.sub(n, m));

}

//销毁

@After public void destory() {

m = 0;

n = 0;

}

}

上面示例中的初始化和销毁都是针对一个方法来说的,每个方法执行前都要进行初始化,执行完毕都要进行销毁。而JUnit的最新版本则提供了新的特性,针对类进行初始化和销毁。也就是说,该类中的方法只进行一次初始化和销毁,方法就是使用@Before和@After,示例代码如下:

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

import static org.junit.Assert.assertEquals;

import org.junit.*;

public class TestAddAndSub {

protected int m = 0;

protected int n = 0;

//初始化

@BeforeClass public void init() {

m = 4;

n = 6;

}

@Test public void add() {

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

assertEquals(10, AddAndSub.add(m, n));

}

@Test public void sub() {

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

assertEquals(2, AddAndSub.sub(n, m));

}

//销毁

@AfterClass public void destory() {

m = 0;

n = 0;

}

}

上述初始化和销毁动作,只执行一次即可。

8.4.4 改变异常处理的方式
以前,使用JUnit进行单元测试时,如果遇到异常情况,需要使用try…catch的形式来捕捉异常,示例代码如下:

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

import junit.framework.TestCase;

public class TestAddAndSub extends TestCase {

private int m = 0;

private int n = 0;

//初始化

protected void setUp() {

m = 4;

n = 6;

}

public void testadd() {

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

assertEquals(10, AddAndSub.add(m, n));

}

public void testsub() {

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

assertEquals(2, AddAndSub.sub(n, m));

}

public void testdiv() {

//断言除数为0

try {

int n = 2 / 0;

fail("Divided by zero!");

}

catch (ArithmeticException success) {

assertNotNull(success.getMessage());

}

}

//销毁

protected void tearDown() {

m = 0;

n = 0;

}

}

JUnit4.0以后的版本将不再使用try…catch的方式来捕捉异常,示例代码如下:

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

import static org.junit.Assert.assertEquals;

import org.junit.*;

public class TestAddAndSub {

protected int m = 0;

protected int n = 0;

//初始化

@Before public void init() {

m = 4;

n = 6;

}

@Test public void add() {

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

assertEquals(10, AddAndSub.add(m, n));

}

@Test public void sub() {

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

assertEquals(2, AddAndSub.sub(n, m));

}

@Test t(expected=ArithmeticException.class) public void div() {

//断言除数是否为0

int n = 2 / 0;

}

//销毁

@After public void destory() {

m = 0;

n = 0;

}

}

当然,JUnit还有许多新的特性,限于篇幅原因,这里只对比较重要的特性进行讲解,其余将不再多讲,想要了解的读者可以到JUnit的相关网站进行学习。

8.5 小结
本章首先讲述了JUnit的下载和安装,接着又讲解了JUnit的相关知识,最后讲解了JUnit的新特性。

JUnit对开发人员进行大规模的单元测试来说,是非常有用的,但对于大量的代码如何来管理就只有靠CVS了。CVS是一个版本控制系统,主要用来管理开发人员代码的历史,下一章主要讲如何使用CVS。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值