150 likes | 305 Views
Unit Testing Java using Groovy and Mock Objects. Walker Hale Human Genome Sequencing Center Baylor College of Medicine. The Plan. Groovy makes testing Java better. Motivation Introduce Groovy Apply Groovy to Testing Mock Objects TestNG Grand Demo. The Setting. Java shop
E N D
Unit Testing Java using Groovy and Mock Objects Walker Hale Human Genome Sequencing Center Baylor College of Medicine
The Plan Groovy makes testing Java better. • Motivation • Introduce Groovy • Apply Groovy to Testing • Mock Objects • TestNG • Grand Demo
The Setting • Java shop • Subversion — for version control • Maven 2 — for most builds • Groovy — for various tasks • Many apps running against a common database and set of libraries
An Ideal Deliverable in Our Shop • Code checked into version control • Builds with maven 2 • Passes all unit tests $ 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 • Compiled (not limited) with JUnit 3.8.2 • Adds • GroovyTestCase • New assertions, such as shouldFail • GroovyTestSuite • Simple command line operation • URLs • http://groovy.codehaus.org/Testing+Guide • http://groovy.codehaus.org/Unit+Testing
Resources • http://groovy.codehaus.org/ • Documentation • Differences+from+Java • Testing+Guide • http://searchgroovy.org/