在最近的一边学习一边复习的过程中,发现了很多有意思的事情。今天就分享一个groovy.lang.MetaClass应用:如何运行中,动态给类和对象增加属性和添加方法。...,工作目录:/Users/oker/IdeaProjects/funtester/,系统编码格式:UTF-8,系统Mac OS X版本:10.16 INFO-> main 我是测试方法:static.test...-> logger.warn("设置" + x) fun.metaClass.setProperty("name", x) return...FAILED INFO-> Test worker 测试类[com.funtest.spock.Mop]开始了 INFO-> Test worker 测试方法开始了 INFO-> Test worker...]结束了 Mop > 测试动态添加对象方法 PASSED Mop > 测试动态添加静态方法 PASSED Mop > 测试动态添加获取属性 > com.funtest.spock.Mop.测试动态添加获取属性
+,Spock自带的Mock和Spy足够好了,对于对象行为的模拟满足绝大部分场景,但是涉及静态方法模拟时候存在局限性,所以引入Mockito和PowerMock来实现设计静态方法的测试模拟场景。...这里不是很建议import static ,因为可能出现混用以及不易排查的问题。 由于目前测试中没有遇到使用Spy放行的逻辑,所以均使用Mock模式,需要对Mock对象的方法进行模拟。...统一使用Spock提供的功能,用到的注解@Shared,不加的话无法在Spock方法中进行赋值操作,但是可以当做一个普通的对象使用。...Mockito模拟对象行为 Mockito和PowerMock配合使用语法稍微复杂一些。...,包括在通过Mock对象创建的对象方法中,如果调用到定义过行为的方法,也会走自定义的逻辑。
Spock是一个Java和Groovy应用的测试和规范框架。之所以能够在众多测试框架中脱颖而出,是因为它优美而富有表现力的规范语言。...def studentDao = Mock(StudentDao) 这一行代码使用Spock自带的Mock方法,构造一个studentDao的Mock对象,如果要模拟studentDao方法的返回,只需...因为Spock使用Groovy作为单元测试开发语言,所以代码量上比使用Java写的会少很多,比如given模块里通过构造函数的方式创建请求对象。...而且调用方式上可以指定属性名,类似于key:value的语法,非常人性化,方便在属性多的情况下构造对象,如果使用Java写,可能就要调用很多的setXxx()方法,才能完成对象初始化的工作。...使用Spock的Mock模拟convert()方法调用,orderMapper.convert(_) >> order,再结合where表格,实现动态Mock接口的功能。
java 中的 spock 正是凭借这样的理念而诞生的一种测试框架。...,动态语言往往因为其过度的灵活性造成项目成员编码风格多样而难以维护,但对于单元测试这样追求便捷与高效的场景来说,动态语言相较于 java 则更加游刃有余,而同时,groovy 兼容 java 语法,可以直接调用...spock 框架也提供了批量测试拆分的机制,只要在方法上加上 @Unroll 注解,多个测试用例就会在结果中被分开展示了。...@Timeout — 测试超时 在方法上添加 @Timeout 注解,可以实现测试用例超时的指定。...Mock 测试通过模拟外部调用的结果,让我们的测试程序得以继续运行,在 JUnit 中,我们需要使用 Mockit 来实现接口的 Mock,同时,Mock 的编写也较为复杂,这些在 spock 中就显得非常简单了
我觉得有以下几点:第一,他可以用更少的代码去实现单元测试,让你可以更加专注于去验证结果而不是写单测代码的过程。那么他又是如何做到少写代码这件事呢?原来他使用一种叫做 groovy 的魔法。...可以简单的理解成跑在 jvm 上的 python 或 js。...所以单测类的后缀不是 .java 而 .groovy 。千万不要创建成普通 java 类了。否则创建没有问题,但是写一些 groovy 语法会报错。...html 的标签的范围是两个标签之间,而 spock 更简洁一点,从这个标签开始到下一个标签开始或代码结束的地方,就是他的范围。...因为 userDao 这个对象是我们 mock 出来的,他就是一个假对象,为了让后续流程按我们的想法进行,我可以通过『 >>』 让 spock 模拟返回指定数据。
在pom文件中添加Spock框架的依赖 在src/test目录下创建groovy文件夹,在groovy文件夹下创建com/test/bookpub包。...Spring Boot优先使用Mockito框架模拟出的实例。...分析 可以看出,通过Spock框架可以写出优雅而强大的测试代码。...setup:这个块用于定义变量、准备测试数据、构建mock对象等; expect:一般跟在setup块后使用,包含一些assert语句,检查在setup块中准备好的测试环境 when:在这个块中调用要测试的方法
前面讲了Spock框架Mock对象、方法经验总结,今天分享一下Spock框架中Mock静态资源的实践经验汇总。分成「静态资源」和「混合场景」。...HttpBase.fetchServiceNames()).thenReturn(["service-prod", "api-pro", "prod", "service-prd", "write-pro"]) 定义静态方法行为和非静态方法行为,在语法上是一致的...原因之前提过,主要是因为增加了类注解之后,Spock和Mockito一的Mock对象和定义方法的功能会无法运行,这个没找到具体的文档做出区分,所以如果遇到混合场景,建议使用PowerMock进行对象的Mock...使用语法上,就是混合了PowerMock处理静态和非静态资源,以及行为模拟的语法。...高版本的依赖mockito-inline中,也是支持对静态类和静态方法的Mock的,但在Spock中极难使用,资料说是因为项目pom中的Spock版本与Mockito版本不一致导致的,尝试了几个组合依然无法解决
在写单元测试的过程中,由于各种依赖的关系导致的阻碍,我们必需用到Mockito类似的框架来完成资源、对象的模拟。...', version: '1.3-groovy-2.5' testCompile group: 'org.springframework', name: 'spring-test', version...mockedList.add("3") mockedList.add("3") mockedList.add("3") expect:"验证属性以及方法调用次数...,有返回值的返回真实的返回值,而mock默认不执行,有返回值的,默认返回null */ def "spy和mock区别"() { given: def list...参考文章: Maven和Gradle中配置单元测试框架Spock Groovy单元测试框架spock基础功能Demo Groovy单元测试框架spock数据驱动Demo ---- 郑重声明:“FunTester
这是2.x的第一个(预)发行版,未完成API,旨在收集与内部Spock迁移到JUnit Platform有关的用户反馈。...由JUnit Platform提供支持 Spock 2.0 M1的主要变化是向JUnit 5的迁移(确切地说,是使用JUnit Platform 1.5(是JUnit 5的一部分而不是JUnit 4运行器...) 并通过JUnit平台激活测试执行: test { useJUnitPlatform() } 另一方面,对于Maven,仍然需要切换到Never Spock版本: ...但是,那太好了,目前还没有办法 “滚动”特定的测试,如Spock 1.x的spock-global-unroll所知。...由于许多Spock测试仅适用于Groovy 3(特别是某些极端情况),因此特别不方便。Spock 2在发行版之前可能会被调整为Groovy 3中的更改已提供兼容性,或者至少会取消上述硬性限制。
之前在写Groovy动态添加方法和属性及Spock单测文章的时候,我还没意识到metaclass的神奇之处,直到有一天我突然想要不经过构建过程直接更新功能,也就是传说中的热更新。...如果通过服务调用命令,实在不是最优之选。...功能验证 我先创建一个类,然后定义一个对象方法,简单输出一个数字。...然后在main方法中创建两个对象,分别调用各自的test()方法,这中间通过metaClass重新实现test()方法,输出FunTester。...HotUpdate.metaClass.test = {Output.output(\"FunTester\")} 接下来,我通过groovy.lang.GroovyShell模拟服务器收到请求脚本
测试方法的生命周期 在junit使用时,主要用以下注解来标记测试类的方法: @Test :标记需要运行的测试方法,一个测试类中可以有多个@Test方法; @Before/@After :标记的方法,会在每个测试方法运行之前...(x, y) where: "校验结果" x | y || z 1 | 0 || 1 2 | 1 || 3 } expect 为核心的测试校验语句块。...以上测试方法的语义为:z是由x和y经过方法plus()运算后得到的结果,现在分别列出了两组x,y,z的值,来测试这个关系是否满足。 由于有两个测试用例,所以plus()方法会在这里运行两次。...6.with()和verifyAll() 取对象属性的值 def "test person use with(p)"() { given: "init a person"...private String name private int age private Date birthday } with()和verifyAll()传入对象后
@Cleanup - 自动的资源管理:安全调用你的close() 方法,无需任何麻烦。...@Builder - … 而且鲍伯是你叔叔:创建对象的无争议且奢华的接口! @SneakyThrows - 在以前没有人抛出检查型异常的地方大胆的抛出吧!...assertThat(new Person(age).isAdult(), is(valid)); } 与标准的JUnit 参数化运行器的区别如下: 更明确 - 参数实在测试方法的参数中,而不是在类的字段中...: //你可以模拟具体的类,而不只是接口 LinkedList mockedList = mock(LinkedList.class); //打桩 when(mockedList.get(0)...可以使得测试能够根据被测试的对象上的API的改变而弹性变化。
★spock是一款全能型的单元测试框架。 ” 上次文章分享了spock框架的基础功能的使用,在此基础上,我根据自己写的Groovy的封装方法、数据驱动以及一些Groovy的高级语法做了一些尝试。...发现还是有一点点问题,不知道是不是因为我本身是Java和Groovy混编的项目导致的,不过也都有了解决方案。...11import static com.fun.frame.Output.output 12import static com.fun.frame.SourceCode.* 13 14class Test02...s2 == list.size() 71 } 72 73 def "测试自定义对象操作"() { 74 given: "给一个自定义对象" 75 def...spock方面的代码演示。
@Cleanup - 自动的资源管理:安全调用你的close() 方法,无需任何麻烦。...@Builder - … 而且鲍伯是你叔叔:创建对象的无争议且奢华的接口! @SneakyThrows - 在以前没有人抛出检查型异常的地方大胆的抛出吧!...assertThat(new Person(age).isAdult(), is(valid)); } 与标准的JUnit 参数化运行器的区别如下: 更明确 – 参数实在测试方法的参数中,而不是在类的字段中...: //你可以模拟具体的类,而不只是接口 LinkedList mockedList = mock(LinkedList.class); //打桩 when(mockedList.get(0))....可以使得测试能够根据被测试的对象上的API的改变而弹性变化。
既然内省是专门用于操作java对象属性的,那首先得搞懂什么是对象的属性 1、什么是java对象的属性呢? 说到属性,大家觉得很熟悉,属性不就是类里最上边的那些全局变量吗?...刚才说的 private String name;private int age; 准确的来说它们应该称为:字段,而不是咱们所说的属性 那什么才是属性?...pd.getName()); } } } 从运行结果上来看,一共得到了5个属性,除了name,age,birthday 外还打印出了abc 上边的代码验证了咱们刚才说的:“属性其实是set、get方法”,而并不是类上边的那些字段...getName方法 (2).BeanUtils.setProperty(s, “name”, “王五”);//调用setName方法 代码操作一下 package com.cj.study.introspector...= BeanUtils.getProperty(s, "name");//调用getName方法 System.out.println(str); //设置值 BeanUtils.setProperty
如图,有如上的方法调用关系(模块依赖关系):A调用B和E方法,B调用C和D方法。 在使用spock进行单元测试时,有如下情景,分别可使用stub和mock。...stub测试桩可以给E方法模拟一个或多个假的返回值,我们测试时只需要调用stub对象的E方法即可,调用后的返回值是我们在生成stub对象时指定的。...以上是spock中stub测试桩的使用场景,总结为一句就是: stub测试桩给被调用者( 方法/模块)制造假的返回值,以便不影响调用者的测试。...使用mock测试桩 mock测试桩就是模拟一个测试的结果。如下图,A类调用类B和C类的某个方法: ?...: http://jvm123.com/2019/09/spock-ce-shi-zhuang-2.html 以上是spock中mock测试桩的使用场景,总结为一句就是: mock测试桩给被测试方法模拟一个预期的效果
不过这不妨碍spock是一个非常优秀的单元测试框架,特别体现在用例的形式和测试报告的展示方式以及报错信息的展示(这个我最中意)。 在简单看过官方文档之后做了一些简单的Demo,分享给大家。...spock.lang.Specification import static com.fun.frame.SourceCode.getLogger class test01 extends Specification...s == ss } def "表达式测试,表达式左右运算符号"() { given: "准备数据" expect: "测试方法" z == x...+ y where: "校验结果" x | y || z 1 | 0 || 1 2 | 1 || 3 } def "表达式测试,表达式左右对象方法..." | 5 "Kirk" | 4 "Scotty" | 6 "Sc3otty" | 7 } def "表达式测试,表达式左右对象方法,
它不是关注TDD,BDD或任何测试方法,但在最低级别,您必须编写代码来自动测试代码。...在本文中,我将分享10个最好的和必不可少的 工具, 框架和库,它们可以帮助Java开发人员在各种Java项目上编写单元测试和集成测试。 1. JUnit 我不认为JUnit需要任何介绍。...我最喜欢的模拟框架是Mockito,但如果你愿意,你也可以探索PowerMock或JMock。 6. Spock框架 Spock是 Java和 Groovy应用程序的另一个测试和规范框架。...Spring Test Spring MVC带有一个非常有用的测试框架,允许在不涉及 Web容器的 情况下进行深入测试。 它是向Spring应用程序编写自动化测试的最有用的库之一。...还有一个Spring Test DbUnit将Spring Test框架与DbUnit和Spring Test MVC HtmlUnit集成在一起,它将Spring Test MVC框架与HtmlUnit
import spock.lang.Specification /** * * * Stub与Mock * (1)相同点 * Stub和Mock对象都是用来模拟外部依赖...* 如果被测程序、系统或对象,我们称之为A。在测试A的过程中, * A需要与程序、系统或对象B进行交互,那么Stub/Mock就是用来模拟B的行为来与A进行交互。...作用如其名,就是在需要时, * 能够发现它存在,即可。就好像点名,“到”即可。...* * 总体来说,stub完全是模拟一个外部依赖,用来提供测试时所需要的测试数据。...* 而mock对象用来判断测试是否能通过,也就是用来验证测试中依赖对象间的交互能否达到预期。
领取专属 10元无门槛券
手把手带您无忧上云