实战groovy -第一部分

例如,对于高性能、事务密集型、企业级应用程序,Groovy 脚本通常不太适合;在这些情况下,您最好的选择 可能是普通的 J2EE 系统。但另一方面,一些脚本 —— 特别是用 Groovy 编写的脚本 —— 会非常有用,因为它能迅速地为小型的、非常特殊的、不是性能密集型的应用程序(例如配置系统/生成系统)快速制作原型。对于报表应用程序来说,Groovy 脚本也是近乎完美的选择,而最重要的是,对单元测试更是如此。

 为什么用 Groovy 进行单元测试?

是什么让 Groovy 比起其他脚本平台显得更具有吸引力呢?是它与Java 平台无缝的集成。还是因为它是基于 Java 的语言(不像其他语言,是对 JRE 的替代,因此可能基于旧版的处理器),对于 Java 开发人员来说,Groovy 意味着一条短得让人难以置信的学习曲线。而且一旦将这条学习曲线拉直,Groovy 就能提供一个无与伦比的快速开发平台。

从这个角度来说,Groovy 成功的秘密,在于它的语法 就是 Java 语法,但是规则更少。例如,Groovy 不要求使用分号,变量类型和访问修饰符也是可选的。而且,Groovy 利用了标准的 Java 库,这些都是您已经很熟悉的,包括 Collections 和 File/IO。而且,您还可以利用任何 Groovy 提供的 Java 库,包括 JUnit。

事实上,令人放松的类 Java 语法、对标准 Java 库的重用以及快捷的生成-运行周期,这些都使 Groovy成为快速开发单元测试的理想替代品。但是会说的不如会做的,还是让我们在代码中看看它的实际效果!

 

JUnit  Groovy

用 Groovy 对 Java 代码进行单元测试简单得不能再简单了,有很多入门选择。最直接的选择是沿袭行业标准 —— JUnit。Unit 的简单性和其功能的强大都是无与伦比的,作为非常有帮助的 Java 开发工具,它的普遍性也是无与伦比的,而且没有什么能够阻挡 JUnit 和 Groovy 结合,所以为什么多此一举呢?实际上,只要您看过 JUnit 和 Groovy 在一起工作,我敢打赌您就永远再也不会回头!在这里,要记住的关键的事,您在 Java 语言中能用 JUnit 做到的事,在 Groovy 中用 JUnit 也全都能做到;但是需要的代码要少得多。

入门

在您下载了 JUnit 和 Groovy(请参阅 参考资料)之后,您将有两个选择。第一个选择是编写普通的JUnit 测试用例,就像以前一直做的那样,扩展 JUnit 令人称赞的 TestCase。第二个选择是应用Groovy 简洁的 GroovyTestCase 扩展,它会扩展 JUnit 的 TestCase。第一个选项是您最快的成功途径,它拥有最多  Java 类似的相似性。而另一方面,第二个选择则把您推进了 Groovey 的世界,这个选择有最大的敏捷性。

开始的时候,我们来想像一个 Java 对象,该对象对指定的 string 应用了一个过滤器,并根据匹配结果返回 boolean 值。该过滤器可以是简单的 string 操作,例如 indexOf(),也可以更强大一些,是正则表达式。可能要通过 setFilter() 方法在运行时设置将使用的过滤器, apply() 方法接受要过滤的 string。清单 1 用普通的 Java 代码显示了这个示例的 Filter 接口: 
清单 1. 一个简单的 Java Filter 接口

 public interface Filter {
        void setFilter(String fltr);
        boolean applyFilter(String value);
}

 

我们的想法是用这个特性从大的列表中过滤掉想要的或者不想要的包名。所以,我建立了两个实现:RegexPackageFilter 和 SimplePackageFilter。

把 Groovy 和 JUnit 的强大功能与简单性结合在一起,就形成了如清单 2 所示的简洁的测试套件:
清单 2.  JUunit 制作的 Groovy RegexFilterTest

 import junit.framework.TestCase
import com.vanward.sedona.frmwrk.filter.impl.RegexPackageFilter
class RegexFilterTest extends TestCase {
void testSimpleRegex() {
    fltr = new RegexPackageFilter()
    fltr.setFilter(“java.*”)
    val = fltr.applyFilter(“java.lang.String”) 

    assertEquals(“value should be true”, true, val)
  }
}

 

不管您是否熟悉 Groovy,清单 2 中的代码对您来说应当很面熟,因为它只不过是没有分号、访问修饰符或变量类型的 Java 代码而已!上面的 JUnit 测试中有一个测试用例 testSimpleRegex(),它试图断言 RegexPackageFilter 用正则表达式 ”java.*” 正确地找到了与 “ java.lang.String”匹配的对象。

 

Groovy 扩展了 JUnit

扩展 JUnit 的 TestCase 类,加入附加特性,实际上是每个 JUnit 扩展通常采用的技术。例如,DbUnit框架(请参阅 参考资料)提供了一个方便的 DatabaseTestCase 类,能够比以往任何时候都更容易地管理数据库的状态,还有重要的 MockStrutsTestCase(来自 StrutsTestCase 框架;请参阅 参考资料),它生成虚拟的 servlet 容器,用来执行 struts 代码。这两个强大的框架都极好地扩展了JUnit,提供了 JUnit 核心代码中所没有的其他特性;而现在 Groovy 来了,它也是这么做的!

与 StrutsTestCase 和 DbUnit 一样,Groovy 对 JUnit 的 TestCase 的扩展给您的工具箱带来了一些重要的新特性。这个特殊的扩展允许您通过 groovy 命令运行测试套件,而且提供了一套新的 assert 方法。可以用这些方法很方便地断言脚本的运行是否正确,以及断言各种数组类型的长度和内容等。