3.6、JUnit一个实例

在控制台中简单的范例如下:

1、写个待测试的Triangle类,创建一个TestCase的子类ExampleTest:

2、ExampleTest中写一个或多个测试方法,断言期望的结果(注意:以test作为待测试的方法的开头,这样这些方法可以被自动找到并被测试)

3、ExampleTest中写一个suite()方法,它会使用反射动态的创建一个包含所有的testXxxx方法的测试套件:

Junit本身的操作并没有什么特别的地方。这里提供了6种测试项目,分别针对不同的测试对象或者可以说是目标。

test case:这个是常用的,也是对程序代码中类的测试。

test suite:这个更高一级,可以一次行测试多个类。其效果与分别 进行多个testcase是相同的。

jdbc fixture:这个是针对数据库链接的测试。(很少用,不大懂。)我学的是默认的jdbc的数据库。

jndi fixture:这个相当于是一个容器测试。如果说主要的内容是测试那些存放链接的fixture。

在编程的时候,经常把一些常用的链接放在一个类似于容器的东东里面,这样,如果调用重复调用链接的话,可以同一调用容器地址,再具体指向里面的链接。这是否是一种管理呢。

comparision fixture:这个也是比较少用的东东。

custom fixture:这个是自定义设置。只是生成一个框架。

junitx.framework包主要功能

该包以类方法的方式扩展junit.framework.Assert的功能。

也是这时候,可以不用继承相应的类,可以直接使用断言的相关的功能。事实上基于元数据的测试框架都基本采用这种方式实现断言。

junitx.framework.Assert

junitx.framework.ArrayAssert

junitx.framework.ComparableAssert

junitx.framework.FileAssert

junitx.framework.ListAssert

junitx.framework.ObjectAssert

junitx.framework.NamingAssert

junitx.framework.OrderedTestSuite

junitx.framework.StringAssert

junitx.framework.ThrowableAssert

2. 测试类的私有属性

2.1 测试类的私有属性的实现

使用相关类(junitx.util.PrivateAccessor)的方法类访问私有属性和方法。

参考:

ExampleJUnit_Addons_Exampleexample1目录下

example1.TestAccount类

example1.Account类

2.2 实现访问类的属性和方法的原理

利用Java的反射机制来实现的。

l .使用java.lang.Class的相关方法,获得相关指定对象的Field,然后调用

field.setAccessible(true);绕过访问权限的检查,然后可以访问Field的值,当然

也可以设置Field的值。

2.使用java.lang.Class的相关方法,获得相关指定对象的Method;然后调用

field.setAccessible(true);绕过访问权限的检查;后执行该方法.

3. junitx.extensions包主要功能

这个包实际上在使用模板方法模式创建测试用例工具类。

使用了模板方法模式,定义抽象类,把相关的测试方法给出具体实现,把被测试对象的创建放到基本方法中。

JUnit-addons框架自己的例子有:

junitx.extensions.ComparabilityTestCase

junitx.extensions.EqualsHashCodeTestCase

junitx.extensions.SerializabilityTestCase

这几个类都定义了几个抽象方法,这些方法主要是用于创建对象的方法,需要在具体类里面实现这些方法。在TestSuite里面,增加测试用例是通过,使用类的无参数构造器来实现的,因此上面的这些类,为了实现测试对象的注入,采用了set注入的方式,而不是构造器注入方式。

参考例子:ExampleJUnit_Addons_Exampleexample1srcextensions目录下extensions.WdzEqualsHashCodeTestCase类

其实,根据IOC的原理,可以把上面几个类的类结构修改下,可以考虑采用构造注入的方式,更好些,不用去定义一些具体类。不过,如果采用构造注入这种方式,需要定义自己的的TestRunner了。