Spock中Mock()、Stub()、Spy()方法的区别

Spock中Mock()、Stub()、Spy()方法的区别

2个月前 (08-30) 浏览: 172 评论: 5

Mock 按照Spock官方文档(https://spockframework.org/spock/docs/2.0/interaction_based_testing.html)的定义: 描述规范下的对象与其合作者之间(强制)交互的行为。 说人话就是Mock()的对象是一个虚拟类,用于替换真实的类,为每个方法调用返回一个默认值:引用类型是null,基本类型为 0 或 false,比如可以把调用其

Spock如何使用JMockit来mock静态方法

Spock如何使用JMockit来mock静态方法

4个月前 (06-27) 浏览: 245 评论: 0

之前的Spock系列mock静态方法主要是通过使用PowerMock实现的,但是使用JMock的同学也挺多的,所以这篇文章讲下在Spock中如何使用JMockit来mock静态方法。 比如下面的业务代码demo,记录日志的logger对象是调用LoggerServiceFactory工厂类的静态方法获取的,这时候就可以使用JMockit把他的静态方法getLoggerService给mock掉,因

Spock注意事项:使用PowerMock对JDK系统类mock时不兼容问题

Spock注意事项:使用PowerMock对JDK系统类mock时不兼容问题

4个月前 (06-21) 浏览: 155 评论: 0

如果你在Spock中使用powermock去mock掉jdk类的静态方法,可能会出现powermock不兼容的问题(感谢"有1024个人"这位朋友的反馈,原文见之前这篇文章的评论:https://javakk.com/281.html)。 比如有下面这个要测试的类,里面调用了java.util.Calendar获取当前的年份,其他代码会调用这个方法,我们可能需要对返回的年份进行mock来测试不同的

Spock单元测试高级语法-groovy闭包

Spock单元测试高级语法-groovy闭包

4个月前 (06-15) 浏览: 206 评论: 0

叫"高级语法"有点言过其实了,标题党嫌疑。主要是针对我们业务代码中一些比较特殊的场景可以考虑使用。 先简单说下Groovy的闭包概念,官方定义: Groovy中的闭包是一个开放,匿名的代码块,可以接受参数,返回值并分配给变量 语法如下: { [closureParameters -> ] statements } 其中[closureParameters->]代表参数,多个参数用逗号分

Spock代码讲解-异常测试场景补充

Spock代码讲解-异常测试场景补充

4个月前 (06-14) 浏览: 171 评论: 0

本篇文章是Spock针对抛异常场景如何测试的补充,在那篇文章中对我们常用的参数校验或条件校验等业务场景代码如何编写单元测试做了讲解,但是有一种情况是,所有的异常测试都测试通过,即抛出了预期的异常类型,但是如何测试正确的case呢?即全部通过校验,没有抛出异常的场景。 简单一点的写法是单独再写一个测试case,只验证这一种通过的场景,跟原来的"thrown() + where"的case分开写,或者

Spock注意事项补充一

Spock注意事项补充一

1年前 (2020-10-08) 浏览: 239 评论: 0

Spock和Mockito注解混用问题 因为Spock并不支持Mockito和power mock的@InjectMocks和@Mock的组合,运行时会报错,如果你一定要使用对应的功能可以引入Mockitio为Spock专门开发的第三方工具:spock-subjects-collaborators-extension使用@Subject和@Collaborator代替@InjectMocks和@M

Spock如何模拟抽象类方法

Spock如何模拟抽象类方法

1年前 (2020-10-07) 浏览: 336 评论: 0

我们平时写单元测试时经常会遇到调用抽象类或父类的方法,这些抽象方法可能是调用底层接口或数据库,需要mock掉,让抽象方法返回一个我们指定的值,以便测试当前代码逻辑的场景。 下面讲下Spock如何结合power mock实现动态mock抽象方法 一. 抽象方法或父类方法动态mock AbstractService 是个抽象类,我们需要把它的方法 parentMethod 模拟掉,返回我们预先设置的"

Spock小结

Spock小结

1年前 (2020-08-20) 浏览: 342 评论: 0

前面的几篇文章介绍了Spock的各种语法,和power mock的结合,以及注意事项,这篇做个总结,让大家对Spock有个全面客观的了解 Spock优点 遵循BDD模式、功能强大、语义规范、可读性好、易于维护、富有表现力 更灵活的控制测试行为,专注代码的逻辑测试而不是书写语法上 用自然语言描述测试步骤(非技术人员也能看懂测试用例) 兼容mock框架,可以和项目中的java单测代码共存,降低迁移成本

Spock注意事项

Spock注意事项

1年前 (2020-08-20) 浏览: 410 评论: 2

Spock虽然好用,但要应用到实际项目中还是需要注意几个问题,下面讲下我们公司在使用过程中遇到的一些问题和解决方案 版本依赖 要使用Spock首先需要引入相关依赖,目前使用下来和我们项目兼容的Spock版本是1.3-groovy-2.5,以maven为例(gradle可以参考官网),完整的pom依赖如下: <spock.version>1.3-groovy-2.5</spock.

Spock代码讲解 – 基类封装

Spock代码讲解 – 基类封装

1年前 (2020-08-19) 浏览: 293 评论: 0

这是Spock系列的第九篇文章,这一篇介绍在实际使用Spock的过程中如何把一些常用的测试方法抽出来,封装成基类使用 BaseSpock 在前面几篇文章讲解Spock结合power mock实现静态方法mock功能时,示例代码里经常会用到LogUtils等工具类的静态方法去记录日志,那我们就可以把LogUtils类的mock代码抽到一个公共类中,然后我们的测试类去继承我们自己实现的公共类 比如我们

Spock高级用法 – 动态mock

Spock高级用法 – 动态mock

1年前 (2020-08-18) 浏览: 1293 评论: 0

这是Spock系列的第八篇文章,上一篇介绍了Spock如何使用power mock测试静态方法,这篇讲解Spock自带的mock功能如何和power mock组合使用,发挥更强大的作用 动态mock静态方法 (spock where + power mock) 在上一篇的例子中使用power mock让静态方法返回一个指定的值,那能不能每次返回不同的值呢? 我们先看下什么场景需要这样做: /**

Spock代码讲解 – 静态方法测试

Spock代码讲解 – 静态方法测试

1年前 (2020-08-18) 浏览: 666 评论: 0

这是Spock系列的第七篇文章,本篇主要讲解Spock如何扩展第三方power mock对静态方法进行测试 实现原理 前面的文章讲到Spock的单测代码是继承自Specification基类,而Specification又是基于Junit的注解@RunWith()实现的,代码如下: @RunWith(Sputnik.class) @SuppressWarnings("UnusedDeclarati

Spock代码讲解-void方法测试

Spock代码讲解-void方法测试

1年前 (2020-08-11) 浏览: 429 评论: 0

这是Spock系列的第六篇文章,本篇讲解如何针对void方法,即无返回结果的方法测试 void方法 void方法的测试不能像前面几篇介绍的那样在then标签里验证返回结果,因为void方法没有返回值 一般来说无返回值的方法,内部逻辑会修改入参的属性值,比如参数是个对象,那代码里可能会修改它的属性值,虽然没有返回,但还是可以通过校验入参的属性来测试void方法 还有一种更有效的测试方式,就是验证方法

Spock代码讲解-异常测试

Spock代码讲解-异常测试

1年前 (2020-08-11) 浏览: 692 评论: 0

这是Spock系列的第五篇文章,这一篇主要讲使用Spock如何测试代码中抛异常的场景 背景 有些方法需要抛出异常来中断或控制流程,比如参数校验的逻辑: 不能为null,不符合指定的类型,list不能为空等验证,如果校验不通过则抛出checked异常,这个异常一般都是我们封装的业务异常信息,比如下面的业务代码: /** * 校验请求参数user是否合法 * @param user * @throws

Spock代码讲解- if esle 多分支场景测试

Spock代码讲解- if esle 多分支场景测试

1年前 (2020-08-09) 浏览: 629 评论: 2

这是Spock系列的第四篇文章,在第二篇讲单元测试开发成本和效率问题时,提到了如何测试复杂的if else场景,分别使用Junit和Spock的实现,以及Spock的优势在哪里,这一篇会详细讲解Spock代码的语法 一. expect + where 如果业务比较复杂,对应的代码实现会有不同的分支逻辑,类似下面的伪代码: if () { if () { // 代码逻辑 } else { // 代码

登录

忘记密码 ?

切换登录

注册