12.1 使用JUnit

用JUnit运行Scala编写的测试相当简单。Scala会编译成Java字节码,用Scala写好测试后,再用scalac编译成字节码,然后运行测试,就像运行通常的JUnit测试用例一样。记得把Scala库放到classpath里。下面看一个用Scala编写JUnit测试的例子:

UnitTestingWithScala/SampleTest.scala

  1. import java.util.ArrayList
  2. import org.junit.Test
  3. import org.junit.Assert._
  4. class SampleTest {
  5. @Test def listAdd() {
  6. val list = new ArrayList[String]
  7. list.add("Milk")
  8. list add "Sugar"
  9. assertEquals(2, list.size())
  10. }
  11. }

上面的代码先后导入了java.util.ArrayListorg.junit.Test。还有org.junit.Assert的所有方法,这跟Java 5普及开来的静态导入(static import)是一样的。SampleTest这个测试类有一个方法listAdd(),以JUnit 4.0的Test注解修饰。测试方法里创建了一个ArrayList实例,然后在其中添加“milk”这个string——除了没有分号,这纯粹就是Java语法。接下来添加“Sugar”也展示了Scala的一些语法糖——去掉.和括号。用Scala编写单元测试,可以尽享这些轻量级语法。最后,断言ArrayList实例里有两个元素。

这段代码可以用scalac编译,执行方式跟JUnit测试是一样的。下面是用到的命令:

  1. scalac -classpath $JUNITJAR:. SampleTest.scala
  2. java -classpath $SCALALIBRARY:$JUNITJAR:. org.junit.runner.JUnitCore
  3. SampleTest

我已经配置了$JUNITJAR$SCALALIBRARY的环境变量,分别指向JUnit JAR包和Scala库的JAR包所在的位置。下面是测试执行的结果:

  1. JUnit version 4.5
  2. .
  3. Time: 0.02
  4. OK (1 test)

看到用Scala写JUnit测试多简单了吗?利用自己熟悉的Scala习惯用法,你还可以让代码更加清晰。不管是Java代码、Scala代码,还是任何为Java平台编写的代码,都可以很直截了当地通过JUnit或TestNG用Scala来测试。接下来,我们将会看到与JUnit相比,ScalaTest提供了哪些优势。