Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
QuickTime™ and a TIFF (Uncompressed) decompressor are needed to see this picture. 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 Demo Time! Resources • http://groovy.codehaus.org/ –Documentation –Differences+from+Java –Testing+Guide • http://searchgroovy.org/