java程序员学习路线图为什么学习Groovy

推荐!国外程序员整理的Java资源大全 - ImportNew
这里搜集了用来构建应用程序的工具。
:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建。Maven优于Apache Ant。后者采用了一种过程化的方式进行配置,所以维护起来相当困难。
:Gradle采用增量构建。Gradle通过Groovy编程而不是传统的XML声明进行配置。Gradle可以很好地配合Maven进行依赖管理,并且把Ant脚本当作头等公民。
字节码操作
编程操作Java字节码的函数库。
:通用底层字节码操作及分析。
:尝试简化字节码编辑。
:使用“流式API”进一步简化字节码生成。
软件度量和质量评估工具。
:对编程规范和标准进行静态分析。
:通过字节码静态分析找出潜在Bug。
:对源代码中不良编程习惯进行分析。
:通过插件集成其它分析组件,提供评估最终结果报告。
创建分析器、解释器和编译器的框架。
:功能完备的自顶向下分析复杂框架。
:相对ANTLR更具体,上手略为简单。支持语法语法超前预测(syntactic lookahead)。
支持持续集成、测试和应用发布的工具。
:Atlassian的持续集成(CI)解决方案,包含很多其它产品。
:提供托管服务,可免费试用。
:提供托管服务,提供有限免费计划。
:ThoughtWork开源持续集成解决方案。
:提供基于服务器的部署服务。
:JetBrain持续集成方案,提供免费版。
:提供托管服务,常用于开源项目。
简化数据库交互的工具、库。
:使用Java API轻松完成数据库迁移。
:小型SQL数据库,以内存操作著称。
:便捷的JDBC抽象。
:基于SQL schema生成类型安全代码。
:针对大数据的分布式SQL查询引擎。
:针对Java的类型安全统一查询。
日期和时间
处理日期和时间的函数库。
:Java 8出现之前,它是日期、时间处理的标准函数库。
:Java高级日期、时间函数库。
帮助代码实现模式的函数库。
:编译期的注入框架,没有使用反射,主要用于Android开发。
:轻量级注入框架,功能强大可与Dagger媲美。
从基础层次上改进开发流程。
:面向切面编程扩展,与程序无缝连接。
:源代码生成器集合。
:通过修改JVM,在运行时可无限次重定义已加载的类。OpenJDK 7、8已提供支持,详情可查看。
:商用软件,无需重新部署可即时重新加载代码及配置。
:代码生成器,旨在减少Java冗余代码。
:使用JVM中可观察序列,创建异步、基于事件应用程序的函数库。
:另一个JVM类重载代理。
:JVM多语言事件驱动应用框架。
分布式应用
用来开发分布式、具有容错性应用程序的函数库和框架。
:构建并发、分布式和具有容错功能的事件驱动应用程序所需的工具包和运行时。
:分布式实时计算系统。
:为大型分布式系统,使用分布式配置、同步和命名注册提供协调服务。
:分布式、高可扩展性内存网格。
:为分布式系统提供延迟和容错处理。
:一组提供可靠消息传输的工具包,可用来创建集群。集群中的节点可互相发送消息。
:为JVM提供轻量级线程和Actor。
使用本机格式分发Java应用程序的工具。
:对二进制发布进行版本控制,可与Maven或Gradle配合使用。
:为跨平台部署建立授权工具。
:将JAR包装为小巧的Windows可执行文件。
:将程序JAR、资源和JVM打包成Windows、Linux和Mac OS X的本机文件。
用来处理Office格式文档的函数库。
:支持OOXML (XLSX、DOCX、PPTX)以及 OLE2 (XLS, DOC or PPT)格式的文档。
:处理OpenDocument格式文档。
游戏开发框架。
:支持现代3D开发的游戏引擎。
:全面的跨平台高级开发框架。
:抽象了OpenGL、CL、AL等函数库的健壮框架。
用来创建现代图形用户界面的函数库。
:Swing的继承者。
:JavaFX虚拟布局工具。
与高性能计算有关的资源,包括集合以及很多具体功能的函数库。
:线程间消息函数库。
:快速紧凑的Java类型安全集合。
:受Smalltalk启发的集合框架。
:Hash set和hash map。
:基本类型集合。
:针对实时嵌入式系统的函数库。
:基本类型集合。
视图简化开发的集成开发环境。
:后台做了很多工作,以其丰富插件著称。
:支持很多JVM语言,为Android开发提供了很多不错的选项。其商业版本主要面向企业用户。
:集成了很多Java SE和Java EE特性,包括数据库访问、服务器、HTML5以及AngularJS。
用来帮助创建、评估或操作图形的函数库。
:Android下载图像和图像缓存函数库。
:多种格式的一维、二维条形码处理函数库。
简化JSON处理的函数库。
:将Java对象序列化为JSON及反向操作。使用时提供了很好的性能。
:与GSON类似,但如果需要频繁初始化Jackson库会带来性能问题。
目前的JVM、JDK实现。
:JDK 9早期访问版本。
:开源实现。
记录应用程序的日志函数库。
:对之前版本进行了完全重写。现在的版本具备一个强大的插件和配置架构。
:对日志进行分析并进行可视化。
:Log4j原班人马作品。被证明是一个强健的日志函数库,通过Groovy提供了很多有意思的配置选项。
:日志文件管理工具。
:日志抽象层,需要与某个具体日志框架配合使用。
提供具体统计算法的工具。其算法可从数据中学习。
:对商用硬件集群上大规模数据存储和处理的开源软件框架。
:专注协同过滤、聚类和分类的可扩展算法。
:开源数据分析集群计算框架。
:用作大数据统计的分析引擎。
:用作数据挖掘的算法集合,包括从预处理到可视化的各个层次。
在客户端之间进行消息传递,确保协议独立性的工具。
:实现JMS的开源消息代理(broker),可将同步通讯转为异步通讯。
:高吞吐量分布式消息系统。
:清晰、准确、模块化且方便嵌入的消息工具。
:ZeroMQ的纯Java实现。
其它资源。
:实现并解释了最常见的。
:内存文件系统。
:类似curses的简单console文本GUI函数库。
:可插入式CRUD UI函数库,可用于快速应用开发。
:创建自己的软件度量或者为支持框架添加度量信息,通过JMX或HTTP进行发布或者发送到数据库。
:用来处理混乱数据的工具,包括清理、转换、使用Web Service进行扩展并将其关联到数据库。
:Java编写原生iOS应用。
自然语言处理
用来专门处理文本的函数库。
:处理类似分词等常见任务的工具。
:斯坦佛的CoreNLP提供了一组基础工具,可以处理类似标签、实体名识别和情感分析这样的任务。
:一组可以处理各种任务的工具集,支持POS标签、情感分析等。
:统计学自然语言处理、文档分类、聚类、主题建模等。
网络编程函数库。
:构建高性能网络应用程序开发框架。
:一个Android和Java应用的HTTP+SPDY客户端。
处理对象持久化的API。
:支持许多持久化标准,JPA、JAXB、JCA和SDO。
:广泛使用、强健的持久化框架。Hibernate的技术社区非常活跃。
:支持快速数据访问和编码的ORM框架。
用来帮助创建PDF文件的资源。
:从XSL-FO创建PDF。
:用来创建和操作PDF的工具集。
:JasperReports的精简版。
:一个易于使用的PDF函数库,用来编程创建PDF文件。注意,用于商业用途时需要许可证。
:一个复杂的报表引擎。
用来创建RESTful 服务的框架。
:偏向于自己使用的Web框架。用来构建Web应用程序,使用了Jetty、Jackson、Jersey和Metrics。
:JAX-RS参考实现。
:经过JAX-RS规范完全认证的可移植实现。
:一个Java类型安全的REST客户端。
:受到Sinatra启发的Java REST框架。
:Swagger是一个规范且完整的框架,提供描述、生产、消费和可视化RESTful Web Service。
用于科学计算和分析的函数库。
:用于科学计算、数据分析和数据可视化环境。
文档索引引擎,用于搜索和分析。
:一个完全的企业搜索引擎。为高吞吐量通信进行了优化。
:一个分布式、支持多租户(multitenant)全文本搜索引擎。提供了RESTful Web接口和无schema的JSON文档。
用于处理安全、认证、授权或会话管理的函数库。
:执行认证、授权、加密和会话管理。
:在云上进行客户端跨平台透明加密。
:为浏览器应用和RESTful Web Service集成SSO和IDM。目前还处于beta版本,但是看起来非常有前途。
:PicketLink是一个针对Java应用进行安全和身份认证管理的大型项目(Umbrella Project)。
:专注认证、授权和多维度攻击防护框架。
用来高效处理序列化的函数库。
:序列化函数库,高效利用内存,无需解包和解析即可高效访问序列化数据。
:快速和高效的对象图形序列化框架。
:一种高效的二进制序列化格式。
用来部署应用程序的服务器。
:针对Servlet和JSP的应用服务器,健壮性好且适用性强。
:Tomcat加Java EE。
:Java EE开源参考实现,由Oracle资助开发。
:轻量级、小巧的应用服务器,通常会嵌入到项目中。
:之前被称作JBoss,由Red Hat开发。支持很多Java EE功能。
对模板中表达式进行替换的工具。
:提供HTML页面模板、email模板和通用开源代码生成器模板。
:通用模板引擎,不需要任何重量级或自己使用的依赖关系。
:使用Java编写的模板引擎,逻辑简单,支持语义扩展(semantic Mustache)。
:通用网站模板,支持自定义标签库。
:旨在替换JSP,支持XML文件。
测试内容从对象到接口,涵盖性能测试和基准测试工具。
:功能性测试和性能评测。
:集成测试和功能行测试平台,集成Java EE容器。
:支持流式断言提高测试的可读性。
:JVM微基准测试工具。
:通用测试框架。
:在自动化单元测试中创建测试对象,为TDD或BDD提供支持。
:为Web应用程序提供可移植软件测试框架。
:为Selenium提供精准的周边API,用来编写稳定且可读的UI测试。
:测试框架。
:提供可视化方式查看运行中的应用程序信息。
通用工具类函数库。
:提供各种用途的函数,比如配置、验证、集合、文件上传或XML处理等。
:集合、缓存、支持基本类型、并发函数库、通用注解、字符串处理、I/O等。
:正如名字表示的那样,提供tuple支持。尽管目前tuple的概念还有留有争议。
用于分析网站内容的函数库。
:可用于生产环境的高度可扩展、可伸缩的网络爬虫。
:简单的轻量级爬虫。
:刮取、解析、操作和清理HTML。
用于处理Web应用程序不同层次间通讯的框架。
:基于组件的框架,使用Java创建动态、强健的、高度可扩展的Web应用程序。
:基于组件的Web应用框架,与Tapestry类似带有状态显示GUI。
:一组Web开发工具集,包含在客户端将Java代码转为JavaScript的编译器、XML解析器、RCP API、JUnit集成、国际化支持和GUI控件。
:Groovy框架,旨在提供一个高效开发环境,使用约定而非配置、没有XML并支持混入(mixin)。
: 使用约定而非配置,支持代码热加载并在浏览器中显示错误。
:JSF框架,提供免费版和带技术支持的商业版。包含一些前端组件。
:微框架,简化了Spring新程序的开发过程。
:旨在简化Java EE的开发过程,提供依赖注入相关组件并支持面向切面编程。
:基于GWT构建的事件驱动框架。使用服务端架构,客户端使用Ajax。
:Java全栈Web开发框架。非常稳固、快速和高效。
:一组Java开发函数库,用于构建快速、高效、可扩展且测试完备的HTTP应用程序。
活跃的讨论区。
:Java社区的Subreddit。
:问答平台。
有影响的书籍
具有广泛影响且值得阅读的Java经典书籍。
可以一边编程一边听的东西。
值得关注的帐号。
:自由职业者、作家、JavaONE明星演讲者、顾问、Java Champion。
:Java Champion、JUG Leader、Devoxx France、Java EE 6/7、JCP、作家。
:Java Champion、JavaONE明星演讲者、JUG Leader、Devoxx4Kids成员、Red Hatter。
:Oracle产品经理、Java Jock。
:Oracle技术团队顾问。
:Spring安全课程作者。
:Java、JavaFX、IoT开发者、作者和演讲者。
:Java EE Twitter官方账号。
:Java杂志官方账号。
:Java.net官方账号。
:Java Twitter官方账号。
:知名Java博客作者。
:Data Geekery(jOOQ)创始人兼CEO。
:RedHatter、JUG协调、活跃讲师和作者。
:Oracle首席架构师、Java平台开发组。
:London JUG co-leader、演讲者、作家、Java Champion等。
:OpenJDK官方账号。
:Java EE、GlassFish、WebLogic传道者、作家、演讲者、开源黑客。
:Java Champion、virtualJUG创始人、LJC leader、RebelLabs作者。
: Java Champion、演讲者。
:作家、NetBeans大牛。
:Java Champion、演讲者。
值得阅读的网站。
(ImportNew 专注 Java 技术)
热烈欢迎参与贡献此列表!
请参阅加入贡献。
原文链接:
- 译文链接: [ 转载请保留原文出处、译者和译文链接。]
关于作者:
我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其实我是一个程序员。(新浪微博:)
可能感兴趣的文章
三句话能讲明白的事情,让开头那两个故事绕晕了。
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2016 ImportNewJava程序员为什么学习Groovy(测试组件) - 简书
下载简书移动应用
写了8897字,被4人关注,获得了3个喜欢
Java程序员为什么学习Groovy(测试组件)
单元测试正是敏捷方法的核心所在。
1.测试是可执行的代码范例,即使文档有过期的风险,测试则会紧跟代码,因为这是编译器强制保证的2.此外,有了单元测试,就意味着开发者能够持续的对代码进行大胆的重构而无需付出太大的测试成本和风险,进而提高代码的健壮性和系统质量,达到程序员最终的解放。
在Java的世界里,JUnit则是引领这个潮流的弄潮儿,是Java程序员开发工具箱里的必备物资,而对于Groovy而言,测试同样重要,鉴于和Java同根同源的现状,Groovy采用了拿来主义的思想,其测试的第一步就是继承JUnit的父类,完成一系列的增强,让其更加好用(事实上,这句话几乎就是Groovy对待Java的“遗产”上的一贯处理方式),下面我们来做具体了解:1.Groovy可以和JUnit3一样,继承junit.framework.TestCase抽象类来构造测试。除了一些语法糖,基本用法和Java一样。2.Groovy可以和JUnit4一样,使用annotation来标记测试方法,@Test,因为JUnit4不要求用户继承固定的父类,所以一般的处理方式是通过静态引入加入Assert这个类,调用其静态的断言方法来实现单元测试的需要。3.可以继承Groovy自己实现的测试父类groovy.util.GroovyTestCase来实现单元测试,在这个父类里,包含了众多方便的断言方法。比如assertLength和shouldFail等。当然,这种靠继承的方式来实现的测试方法被识别出来的规则和JUnit3一样:方法需要是public,无返回值的,且名字必须以test开头才行。
class LabTest extends GroovyTestCase{
public void testArrayEquals() {
def mm =["a", "b"] as String[]
assertArrayEquals(mm, ["a", "b"] as String[])
public void testLength(){
assertLength(3, ["c", "b"] as String[])
结果为: junit.framework.AssertionFailedError: expected:&3& but was:&2&
4.脚本测试,Groovy作为一种便于脚本的语言,脚本测试的便利性也很重要。执行脚本测试,可以使用GroovyShell类来编程式的调用脚本来执行。具体如下面的例子:
import groovy.json.JsonSlurper
def jsonResult = ".cn/data/.html".toURL().getText()
def jsonParser = new JsonSlurper().parseText(jsonResult)
jsonParser?.weatherinfo?.with {
println "temp: $temp1 @ city: $city"
这个例子打印某个城市的天气,可以获得一个Json的返回值,大致如下:
"weatherinfo": {
"city": "哈尔滨",
"temp1": "-5℃~-17℃"
篇幅所限,这里精简了大部分的结果,只保留了我们脚本需要输出的部分,对于这个脚本,我们需要在使用它之前对它进行合理的测试,我们试试刚说到的GroovyShell类
import static org.junit.Assert.*;
import org.junit.T
class GetWeatherInfoTest{
public void test() {
GroovyShell shell = new GroovyShell()
shell.evaluate(new File("src/groovytestlab
/GetWeatherInfo.groovy"));
上面的只是可以编程式的执行脚本,但是对于脚本做断言,我们还需要能够拦截到脚本执行的时候的标准输出,对于GroovyShell的话,指定一个Binding对象就可以做到,改善后的代码如下:
import static org.junit.Assert.*;
import org.junit.T
class GetWeatherInfoTest{
public void test() {
Binding binding = new Binding()
def content = new StringWriter()
binding.out = new PrintWriter(content)
GroovyShell shell = new GroovyShell(binding)
shell.evaluate(new File("src/groovytestlab/GetWeatherInfo.groovy"));
assert content.toString().trim() =~ /temp:\s*\d+℃~\d+℃ @ city: \W+/
如此一来就可以拦截到Groovy脚本的输出并作出校验了,我们还能更进一步,继承Groovy提供的GroovyShelTestCase来构件测试,这个类继承自GroovyTestCase,其隐式的包含了一个protected成员shell,即上例中所说的GroovyShell,完成后的代码如下:
class GetWeatherInfoTest extends GroovyShellTestCase{
public void test() {
def content = new StringWriter()
withBinding(out:new PrintWriter(content)) {
shell.evaluate(new File("src/groovylab/GetWeatherInfo.groovy"));
assert content.toString().trim() =~ /temp:\s*\d+℃~\d+℃ @ city: \W+/
和上面一个差别不大,不过是在已有具备shell的背景下,我们可以在withBinding方法里,以Map的方式把需要指定的标准输出放进去,在withBinding的闭包作用域里,我们都能自由的使用这些设定。5.日志测试子类GroovyLogTestCase被测试类:
class LogTestLab {
def log = Logger.getLogger(this.class.name)
int plus(int a,int b){
int z = a+b
("result is ${z}")
class LogTest extends GroovyLogTestCase{
LogTestLab labtest = new LogTestLab();
void testLog(){
String log = , LogTestLab.class.name) {
labtest.plus(3, 2)
assert log.contains("result is 5")
对于这类型的子类来说,关键在于能够通过父类提供的stringLog方法,提取到所需要的日志信息并进行最终校验。5. as用过swing的人都知道,如果需要增加一个鼠标事件,有两种方式,一种是实现MouseListener接口,必须实现接口里面如mouseClicked,mousePressed等5个方法才行,而实际上我们可能只需要其中一两个,此时一般我们会换用另一种更省事的方式,即去继承一个叫MouseAdapter的适配器类,这个抽象类也继承于MouseListener,已经帮我们空实现了所有的监听方法,我们只要覆写自己需要的方法即可。提到这个,是因为在测试中,我们也往往面临这种处境,为了保证测试的隔离,我们往往需要mock出多种不同的对象,而这个对象也许在业务中我们只需要用到它的很少一部分特性,只需要构建我们需要的部分,其它留给Groovy来填补,这会是一个不错的主意。一个学生类:
class Student {
String listenerState
void study(){
if(listener){
listenerState = listener.studentsStudy()
一个监听学生行为的接口:
public interface StudentListener {
public String studentsLeave();
public String studentsCome();
public String studentsStudy();
public String studentsSleep();
我们现在要写一个测试,来看一下当学生学习的时候,监听接口的studentsStudy接口是否已经被调用,这里我们只需要测试接口里的这个方法。
import org.junit.Test
class StudentStudyTest {
Student stu = new Student()
public void testStudyEvent(){
stu.listener={
"students start study"} as StudentListener
assert stu.listenerState == null
stu.study()
assert stu.listenerState=="students start study"
这里的代码清楚的显示,利用as关键词,groovy用一个闭包就mock出了StudentListener的对象,而且能够提供合适的行为。也许读者要问,这里并没有告诉它我们需要实现哪个方法呀,它是如何把闭包的实现和我们需要的方法绑定的呢?我们可以在Student里再实现一个come方法,调用监听器的studentsCome()方法,检查stu的状态我们会发现,被执行的依然是我们闭包里的代码。这就是全能小王子闭包,它无处不在。但是我们有时候的确需要实现多于1个的实现,这时候我们可以用Map的方式来指定我们方法和闭包实现之间的关系。如下所示。
stu.listener = [studentsStudy:{"students start study"}, studentsCome:{"students start come"}] as StudentListener
assert stu.listenerState == null
stu.study()
assert stu.listenerState=="students start study"
stu.listenerState = null
assert stu.listenerState == "students start come"
6.Expando使用Groovy的时候,无处不在的是它强大的MOP特性,这里展示它用代码来创建一个mock对象的过程,强大的秘诀就在于Expando这个类。下面我们来具体看下Expando的一个小例子:
def ex = new Expando()
ex.name = 'XiaoMing'
ex.speak = { "$name says Hello World!" }
println ex.speak()
我们可以看出,Expando的创建过程和使用asm工具修改字节码产生一个Java对象类似,但是两者绝不相同,Expando只是创建了一个形似之物,借助于Groovy的动态类型,就成功的完成了mock过程。7、StubFor和MockForStub和Mock,是测试领域经常拿出来辨析的两个概念,两者在很多地方使用的界限也比较模糊,按照我的理解,Stub大致就是一个简单的实现,充当实际业务的“替代者”,而Mock则纯粹就是无中生有来替代依赖系统的。不过在Groovy里的两个相关类又不一样:两者都有“替代”作用,而StubFor对交互的约定没有MockFor这么强烈。下面以给String类增加两个不存在的模拟方法,来说明两个类的用法:
def stubfor = new StubFor(String.class)
stubfor.demand.one(1..2) { 1 }
stubfor.demand.two()
stubfor.use {
def caller = new String()
assertEquals 2, caller.two()
assertEquals 2, caller.one()
StubFor主要构建是demand和use两个方法的使用,一个指定了需要被模拟的方法和具体的实现过程,实现过程用闭包来处理;而use则打开一个闭包,在闭包的上下文里,demand指定的方法完全的生效,demand闭包括号里的(1..2)不是方法参数,而是表示这个方法可以被调用的次数是1次或者2次。读者可以通过增减use里面的断言判断,来找到subFor的规则约束所在:(1)use代码块里,demand指定的方法调用次序必须是和声明的一致。(2)use代码块里,demand指定的方法不一定都要调用到,不过如果调用到,调用次数不能超过定义的次数。
def mocker = new MockFor(String.class)
mocker.demand.one(1..2) { 1 }
mocker.demand.two()
mocker.use {
def caller = new String()
assertEquals 1, caller.one()
assertEquals 1, caller.one()
assertEquals 2, caller.two()
MockFor的用法和SutbFor是一致的,无需赘言,这里注意下,在MockFor的demand里定义了的方法,则必须顺序和次数都必须严格在use里出现,否则就视为错误,这是和StubFor的主要不同。
8.Spock-下一代测试框架在测试方法,最有资格代表Groovy系列出战的组件就是Spock了,它对应于Java中的JUnit,其灵活的编码方式,自解释的case类型,都让人耳目一新,下面做一个简单的介绍。使用Spock的测试都必须继承spock.lang.Specification这个类,具体的方法格式是:
描述性文字(){
语法关键词:语法块
一个很直观的例子是:
import spock.lang.Specification
class SampleSpec extends Specification {
String quote = """I am endeavoring, ma'am, to construct a mnemonic memory circuit, using stone knives and bear skins."""
List&String& strings
def setup() {
strings = quote.tokenize(" ,.")
def "测试list是不是长度为16"() {
expect: strings.size() == 16
def "我加一个单词进去看看长度是不是加了1"() {
when: strings && 'Fascinating'
then: strings.size() == old(strings.size()) + 1
这个例子给我们很多的信息量,比如spock的测试前执行方法名字是setup,比如描述性语句是如此个性化,写成这样那注释也没必要写了,语句块的expect和then接受的都是boolean值的表达式,而when则是设置条件的,里面比较怪异的old方法,居然可以获取到改变之前的队列值。接下来再来一个例子,说明spock里数据驱动类型的用例。
class SampleSpec2 extends spock.lang.Specification {
def "#name should have #length"(String name, int length) {
name.size() == length
"Scotty" | 6
def "check lengths using arrays"() {
expect: name.size() == length
name && ["Spock","Kirk","Scotty"]
length && [5,4,6]
def "check #length using #name pairs"() {
expect: name.size() == length
[name,length] && [["Spock",5],["Kirk",4],["Scotty",6]]
这个例子展示的是where关键词的用法,里面可以放入三种不同类型的数据集,然后以迭代的方式逐一进行测试,读者需要注意这么几个地方。@unroll注解可以平铺开每个数据项,使测试结果更加好看,比如第一个测试用例执行后我们可以看到:
Spock should have 5(0.000s)Kirk should have 4(0.000s)Scotty should have 6(0.000s)而如果去掉@unroll,则看到
#name should have #length进而可以了解到,@unroll,还给描述性语句带来了变量替换的功能。另外,例子中第一种描述方式为表输入描述。第一行叫做表头,是类似于方法形参的东西,表头以外的行的数据都会依次替换到对应表头代表表达式里面去,表结构方式表至少需要两列,如果只有一个变量的话,第二列可以使用_来作为替换。另外两个用例则都是容器数据注入的方式,可以根据需要灵活决定。这里对spock只做了简单介绍,更多的东西,可以到spock的github站点或者主页去了解更多。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
简书程序员大本营
投稿须知:
1.本专题仅收录与程序有关的文章。
2.请在代码框里写代码,尽量保证可看性。
· 70202人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 java程序员学习计划 的文章

 

随机推荐