Alex称之为inline test,就是说通过注解来写测试,这样源代码也包含了测试代码,可以从源代码中编译产生出测试类。
这么做有两个原因:
- 创建测试需要一定的套路(在单独目录中创建测试类),可我们很懒(其实我也很懒,可是不如人家懒得水平高:))
- 还有就是在我们开发API时,这种方式比较方便
GrUnit的基本情况上篇文章中已经介绍了,现在看看inline test长啥样:
@GrUnit({
@Field Calculator calc
setUp { calc = [] }
})
@Typed
class Calculator {
private ArrayList<double> list = []
@GrUnit({
assertEquals(10d, calc.push(10d).list[-1])
})
Calculator push(double v) {
list.push(v)
this
}
@GrUnit({
shouldFail { calc.peek() }
})
double peek() {
list[-1]
}
@GrUnit({
testFailIfEmpty{ shouldFail { calc.pop() } }
testPushPop {
assertEquals(10d, calc.push(10d).pop())
assertEquals(0, calc.list)
}
})
double pop() {
list.pop()
}
@GrUnit({
assertEquals (4d, calc.push(4d).peek())
testPlusNull{ assertEquals (10d, calc.push(6).plus().peek()) }
testPlusNonNull {assertEquals (10d, calc.plus(6).peek())}
})
Calculator plus(Double value = null) {
push((value == null ? pop () : value) + pop ())
}
}
最终,编译器将产生一个扩展自GroovyTestCase的静态内部类,每个由@GrUnit注解标注的方法都会创建一个测试方法。
注意事项:
IDE并不知道我们所产生的测试类,因此必须多做些工作,为我们的测试创建运行配置。最简单的方法是指定groovy.util.test.GrUnitTestSuite为测试类并提供VM参数-Dgroovy.test.dir="out/production/Examples"(从这里找到已编译的测试类)。
另外,已编译的inline test与源代码编译后的类文件是放在一起的。或许你想把测试文件移走,那么你可以用"*$GrUnitTest*.class"来找出生成的测试类。

第七行是自动补全的错误?
第七行是自动补全的错误?
已更正,谢谢指出错误。
已更正,谢谢指出错误。