Testing Java Using Groovy
Testing Java Using Groovy
$ svn checkout \
$repo/my-project/trunk \
my-project
$ cd my-project
$ mvn test
The Plot
The Motivation
More unit testing!
The Insight
Small changes in the difficulty or unpleasantness
of a task produce disproportionately large changes
in how much that task is performed.
Enter Groovy
Groovy in 15 Minutes
Almost all Java code is Groovy code
no inner classes
http://groovy.codehaus.org/Differences+from+Java
Groovy adds:
Fun syntactic sugar
Lazy method dispatch
Methods to the standard Java library classes
Closures
Groovy-specific classes
Interactive shell
Syntax Sugar
// MapSample.java
import java.util.*;
public class MapSample {
public static void main(String[] args) {
Map<Object, Object> m =
new LinkedHashMap<Object, Object>();
m.put("red" , 1);
m.put("blue", 2);
System.out.println(m.getClass());
System.out.println(m);
}
}
// MapSampleG.groovy
def m = [red:1, blue:2]
println m.getClass()
println m // .toString() for Java-style output
Syntax Sugar
$ javac MapSample.java
$ java MapSample
class java.util.LinkedHashMap
{red=1, blue=2}
$ groovy MapSampleG.groovy
class java.util.LinkedHashMap
["red":1, "blue":2]
$ groovyc MapSampleG.groovy
$ java -cp `pwd`:$GROOVY_EMBED_JAR MapSampleG
class java.util.LinkedHashMap
["red":1, "blue":2]
Lazy Dispatch & Expanding JDK
// DispatchSample.groovy
def x = "Hello World"
def l = ["abc", "def"]
println x.split()
l.addAll x.split().toList()
println l
l << "more" << "stuff"
println l
$ groovy DispatchSample.groovy
{"Hello", "World"}
["abc", "def", "Hello", "World"]
["abc", "def", "Hello", "World", "more", "stuff"]
Closures 1
// ClosureSample1.groovy
def c = { it + it }
println c(2)
println c("hello ")
def foo(Closure cl) {
cl(5, 7)
}
println foo { x, y -> x + y }
println foo { x, y -> x * y }
$ groovy ClosureSample1.groovy
4
hello hello
12
35
Closures 2
// ClosureSample2.groovy
[2, 3, 5].each {
println it * it
}
[red:1, blue:2].each { key, value ->
println key * value
}
$ groovy ClosureSample2.groovy
4
9
25
red
blueblue
Closures 3
// ClosureSample3.groovy
def strategies = [ add:{ a,b -> a + b },
mult:{ a,b -> a * b } ]
[[1,2], [3,4], [5,6]].each { data ->
strategies.each { name, code ->
printf "%d %4s %2d\n", data,
name, code(data)
}
}
$ groovy ClosureSample3.groovy
[1, 2] add 3
[1, 2] mult 2
[3, 4] add 7
[3, 4] mult 12
[5, 6] add 11
[5, 6] mult 30
Testing in Groovy
http://groovy.codehaus.org/
Documentation
Differences+from+Java
Testing+Guide
http://searchgroovy.org/