做者:chszsjava
1. 断言
Java开发者经常使用JUnit或TestNG作单元测试,因此对断言是很清楚的。断言是用于验证假设的条件是否为真。在Groovy的断言中,若是假设的条件不为真,那么就会抛出java.lang.AssertionError异常。使用Groovy表达式来测试假设条件。
好比:
groovy:000> assert 1==2 : "One isn't Two"
ERROR java.lang.AssertionError:
One isn't Two. Expression: (1 == 2)
at groovysh_evaluate.run (groovysh_evaluate:2)
...
Java的断言也是这么写的:
assert 1==2 : "One isn't Two";
可见,Groovy的断言语法与Java的断言相同,Groovy的断言能够省略分号。
断言的使用技巧:
当你使用断言时,你应用包含一条消息。此消息能够帮助其余人维护和理解你的代码,理清你的意图。
正则表达式
2. 强断言
Groovy的断言assert关键字仅仅是检查表达式是否为真。若是为假,断言仅仅告诉开发者,表达式不成立,以及表达式使用的变量值,除此之外什么都没有。若是使用强断言,断言的输出会提供表达式的每个子表达式的可视化展示。下面我将详细说明强断言。
groovy:000> assert 1==1: "One isn't Two"
===> null
groovy:000> assert new File('HelloWorld.txt')==new File('Hello.txt')
ERROR org.codehaus.groovy.runtime.powerassert.PowerAssertionError:
assert new File('HelloWorld.txt')==new File('Hello.txt')
| | |
HelloWorld.txt | Hello.txt
false
at groovysh_evaluate.run (groovysh_evaluate:2)
...
断言能够方便地对代码进行测试。
编程
3. Strings
Groovy支持两种字符串:常规的Java字符串和GStrings。
在Groovy中,用单引号或双引号括起来的字符串是java.lang.String类的一个实例,
GStrings是groovy.lang.GString类的一个实例,它容许在文本中包含占位符。GStrings并非String的子类,由于String类是final类型,并且是不能被扩充的。
GString很像普通的字符串,可是他容许在其内使用${..}嵌入变量。若是内嵌的变量只是占位符,那么能够省略{}花括号。
Groovy支持一些编程语言如Perl或Ruby所谓的字符串插入(String Interpolation)。字符串插入是字符串内的表达式或变量的替代。若是你熟悉Unix Shell编程或Ruby、Perl编程,那么你应该很熟悉这一点。
Java不支持字符串插入,你必须手动的进行值连结。
Java的字符串操做例子:
String name = "Jim";
String helloName = "Hello " + name;
System.out.println(helloName);
若是是使用Groovy的GString,那么能够这样:
groovy:000> str1 = "Li Sir"
groovy:000> str2 = "Hello "
groovy:000> println "$str2$str1"
Hello Li Sir
可见,正如前面所讲,若是内嵌的变量只是占位符,那么能够省略{}花括号。
当Groovy看到表达式内的内嵌变量时,Groovy会构造一个org.codehaus.groovy.runtime.GStringImpl来代替java.lang.String。当访问GString时,表达式会被从新计算。
注意,你能够在${}内包含任意有效的Groovy表达式,能够是方法调用或变量名。
windows
4. 单行字符串
单行字符串能够用单引号或双引号包围,可是二者是有区别的。
单引号包围的表达式,里面的字符串插值是不会被识别的。双引号包围的表达式正好相反。
举例:
name = "LiSir"
s1 = 'Hello $name'
println s1
输出:
Hello $name
例子:
name = "LiSir"
s1 = "Hello $name"
println s1
输出:
Hello LiSir
可见,由双引号定义的字符串,其内嵌的表达式会被解释。
编程语言
5. 多行字符串
Groovy支持字符串跨越多行,多行字符串由三个双引号或者三个单引号定义。
多行字符串对于建立模板(如XML模板)或内嵌的文档(SQL语句、HTML等)是很是有用的。还有不少用途。好比,可使用多行字符串和字符串插值创建电子邮件的主体内容。
好比:
def name = "Jim"
def multiLineQuote = """
Hello, ${name}
This is a multiline string with double quotes
"""
println multiLineQuote
println multiLineQuote.class.name
def multiLineSingleQuote = '''
Hello, ${name}
This is a multiline string with single quotes
'''
println multiLineSingleQuote
println multiLineSingleQuote.class.name
输出:
Hello, Jim
This is a multiline string with double quotes
org.codehaus.groovy.runtime.GStringImpl
Hello, ${name}
This is a multiline string with single quotes
java.lang.String单元测试
6. 斜线字符串
正如早先提到的,斜线能够用于定义字符串。用斜线定义字符串有一个优势:那就是,字符串自己的内容无需转义反斜线。
好比:
def winpathQuoted = 'C:\\windows\\system32'
def winpathSlashy = /C:\windows\system32/
println winpathSlashy // C:\windows\system32
assert winpathSlashy ==~ '\\w{1}:\\\\.+\\\\.+'
assert winpathSlashy ==~ /\w{1}:\\.+\\.+/
测试
7. 多行斜线字符串
斜线字符串还可以跨越多行。这一点对于多行正则表达式很是有用。
好比:
def name = "vishal"
def path = "c:/groovy/"
def multilineslashy = /
Hello $name
path $path
dollar = $
path = c:\/groovy
/
println multilineslashy
输出为:
Hello vishal
path c:/groovy/
dollar = $
path = c:/groovy
ui
8. 斜线字符串中的美圆符号$
在多行斜线字符串中,若是字符串内出现斜线/,那么它须要被转义。另外,若是字符串内出现了$美圆符号(没有用于表达式时),也须要转义,不然会报MissingPropertyException异常。
好比:
def name = "vishal"
def path = "c:/groovy"
def multilineSlashy = /
Hello $name
path = $path
dollar = $test
path = c:\/groovy
/
println multilineSlashy
输出:
Exception thrown
四月 17, 2013 9:11:24 下午 org.codehaus.groovy.runtime.StackTraceUtils sanitize
WARNING: Sanitizing stacktrace:
groovy.lang.MissingPropertyException: No such property: test for class: ConsoleScript3
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
at ConsoleScript3.run(ConsoleScript3:3)
at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:257)
at groovy.lang.GroovyShell.run(GroovyShell.java:481)
at groovy.lang.GroovyShell.run(GroovyShell.java:163)
at groovy.lang.GroovyShell$run.call(Unknown Source)
at groovy.ui.Console$_runScriptImpl_closure17.doCall(Console.groovy:951)
at groovy.ui.Console$_runScriptImpl_closure17.doCall(Console.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
at groovy.lang.Closure.call(Closure.java:411)
at groovy.lang.Closure.call(Closure.java:405)
at groovy.lang.Closure.run(Closure.java:492)
at java.lang.Thread.run(Thread.java:722)
groovy.lang.MissingPropertyException: No such property: test for class: ConsoleScript3
at ConsoleScript3.run(ConsoleScript3:3)lua