为了可以快速编写单元测试,需要单元测试架构的帮助。对于Java代码而言,JUnit是最受欢迎的单元测试架构之一。JUnit在Java开发人员之间被广泛应用,并且得到了所有流行的Java IDE(如Eclipse、IntelliJ和NetBeans)的支持。PIX的所有单元测试都是使用JUnit编写和执行的。
注意:
JUnit存在两个仍在使用的版本,即3.x和4.x。本书使用的是3.x版本,这主要是因为在撰写本书时许多Spring 2测试支持类还处于JUnit 3.x的级别上。
单元测试架构(如JUnit)可以在以下方面提供帮助:
为代码基址创建单元测试
将单元测试组织成测试用例和测试套件
运行单元测试
注意:
在这个"试一试"中,将检验用于测试域模型中的PixUser POJO的单元测试代码。如果想要学习一些JUnit的示例,以及阅读一些文档,那么可以从JUnit的官方网站:http://www.junit.org/上下载JUnit。然而,如果只是想试一试本节中的单元测试,那么不需要下载或安装JUnit。在项目的Maven pom.xml文件中,JUnit 3已经被指定为依赖关系。Maven 2会自动(通过Internet)从中央存储库上下载必需的JUnit JAR。
遵循以下步骤,以检验如何编写PixUser单元测试代码:
(1) 要使用JUnit为PixUser POJO创建一个单元测试用例,首先需要从junit.framework.TestCase中派生一个类,如下面摘取的代码所示:
这段代码可以在下载的源代码的wrox-pix-web/test/java/com/wrox/beginspring/pix目录下的PixUserTest.java文件中找到。
(2) 在每个测试用例中,可以提供一个可选的setUp()方法。这个方法中的代码在测试用例中的每个测试运行以前执行。这是进行局部公用初始化、资源分配和/或为测试用例中的测试编写准备代码的好地方。还可以提供一个可选的tearDown()方法来为每次测试执行资源重新分配或者清理工作。例如,在PixUser中,下面的setUp()方法在一个数组中创建了两个PixUser实例以进行测试。在PixUserTet.java文件列表中继续往下看,可以看到setUp()方法:
(3) 在使用JUnit 3.x的时候,可以指明架构某个特定的方式是一个测试,方法是将其命名为一个以test开始或结束的公用方法。例如,要测试PixUser POJO的字段,可以创建一个名为testFields的方法,如下面摘取自PixUserTest.java的代码所示:
工作原理
通过从JUnit的TestCase类继承,PixUserTest获得了创建单元测试所需的全部支持。在运行单元测试的时候,测试运行器会寻找setUp()方法,并在运行测试用例以前执行它。在这里,PixUserTest的setUp()方法准备了两个PixUser的实例,每个实例中都有一些字段具有特殊的值(比如userName、firstName、lastName)。
在单元测试方法testFields()中,每个实例都被测试以保证POJO包含的字段值与setUP()方法中设置的值相同。测试这些值的首选方法是使用Java的assert()语句:从testFields()方法中可以看到这一点。任何不匹配的字段都会造成一个断言错误被抛出,而实例则不能通过单元测试。只有所有的字段都包含预期的值时单元测试才会通过。
运行测试用例
JUnit带有一个测试运行器实用程序。这个测试运行器通过寻找以test开始或结束的公用方法来确定将要在测试用例中运行的测试。这里testFields()方法被确定为一个测试。多数IDE和构建架构都带有自己的测试运行器;它们使用与JUnit测试运行器相同的约定确定将要运行的测试。下一个"试一试"会说明如何使用JUnit的测试运行器运行单元测试。
注意单元测试用例中大量使用了assert()。这些assert()的实例负责检查单元测试中期望的正确行为。在运行单元测试时要记住(使用-ea Java VM参数)启用assert()。如果单元测试成功,那么它将会悄悄地完成。否则将抛出AssertionError,测试运行器会捕获这个错误、报告失败、并且停止运行。如果任何其他的异常在执行期间被传递到顶层,那么测试运行器也会停止运行并报错。
这是最后一个"试一试",将会在其中使用JUnit测试运行器运行PixUserTest单元测试。