基于Java汇总Spock框架Mock静态资源经验

目录
  • 一、静态方法
  • 二、混合场景

前面讲了Spock框架Mock对象方法经验总结

一、静态方法

Mock静态方法我们使用PowerMock结合Mockito的方案,首先在测试类增加如下注解:

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([NewUtil.class, HttpBase.class])
@PowerMockIgnore(["javax.management.*"])
@SuppressStaticInitializationFor(["com.funtester.util.NewUtil", "com.funtester.util.HttpBase"])

@RunWith@PowerMockRunnerDelegate注解内容不用改动,直接复制即可,@PrepareForTest注解后面的类就是需要被Mock的类。@PowerMockIgnore这个注解用于忽略一些检查和异常。@SuppressStaticInitializationFor这个注解处理类的初始化,这个注解后面跟的是不需要进行初始化的类的包路径,在现在的实践中通常和@PrepareForTest后面的类是一致的。

其次我们需要在类初始化代码中对这个类进行Mock,语法如下:

PowerMockito.mockStatic(HttpBase.class)
PowerMockito.mockStatic(NewUtil.class)

下面演示一下如何自定义静态方法的行为:

        PowerMockito.when(HttpBase.fetchServiceNames()).thenReturn(["service-prod", "api-pro", "prod", "service-prd", "write-pro"])

定义静态方法行为和非静态方法行为,在语法上是一致的,

二、混合场景

当一个测试用例中,既要Mock静态方法,也要Mock对象方法,就必须使用PowerMock提供的能力。原因之前提过,主要是因为增加了类注解之后,SpockMockito一的Mock对象和定义方法的功能会无法运行,这个没找到具体的文档做出区分,所以如果遇到混合场景,建议使用PowerMock进行对象的Mock。

使用语法上,就是混合了PowerMock处理静态和非静态资源,以及行为模拟的语法。

Demo如下:

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([NewUtil.class, HttpBase.class])
@PowerMockIgnore(["javax.management.*"])
@SuppressStaticInitializationFor(["com.funtester.util.newinterface.NewUtil", "com.funtester.util.slowapi.HttpBase"])
class TaskScheduledTest extends Specification {

    @Shared
    def service = PowerMockito.mock(IService)

    def drive = new TaskScheduled(IService: service, cid: "")

    def setupSpec() {
        PowerMockito.mockStatic(HttpBase.class)
        PowerMockito.mockStatic(NewUtil.class)
        PowerMockito.when(HttpBase.fetch()).thenReturn(["ood", "ero"])
        Mockito.when(newutil.filter(Mockito.any())).thenReturn(true)
        Mockito.when(newser.selectAll()).thenReturn([new NewInterface() {

            {
                setUrl("/abc")
                setNname("test")
                setMethod("GET")
            }
        }, new NewInterface() {

            {
                setUrl("/abcd")
                setNname("test")
                setMethod("POST")
            }
        }, new NewInterface() {

            {
                setUrl("/abce")
                setNname("test")
                setMethod("GET")
            }
        }])
        //这里因为send方法中用到了这个静态方法
        PowerMockito.when(NewUtil.getsAll(anyList(), anyBoolean())).thenReturn([new NewInterface() {

            {
                setUrl("/abc")
                setNname("test")
                setMethod("GET")
            }
        }, new NewInterface() {

            {
                setUrl("/abc")
                setNname("test")
                setMethod("GET")
            }
        }])
    }

    def "Send"() {
        given:
        drive.send()

    }

    def "day"() {
    }
}

PS:在Mockito高版本的依赖mockito-inline中,也是支持对静态类和静态方法的Mock的,但在Spock中极难使用,资料说是因为项目pom中的Spock版本与Mockito版本不一致导致的,尝试了几个组合依然无法解决,又有人言,跟Groovy依赖的版本也有关系,直接破防,放弃了这个方案。

到此这篇关于基于Java汇总Spock框架Mock静态资源经验的文章就介绍到这了,更多相关Spock框架Mock静态资源经验汇总内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入学习Java单元测试(Junit+Mock+代码覆盖率)

    前言 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进或重构之后的正确性. 一般来说,单元测试任务包括 1.接口功能测试:用来保证接口功能的正确性. 2.局部数据结构测试(不常用):用来保证接口中的数据结构是正确的 1.比如变量有无初始值 2.变量是否溢出 3.边界条件测试 1.变量没有赋值(即为NULL) 2.变量是数值(或字符) 1.主要边界

  • Java中Spock框架Mock对象的方法经验总结

    目录 一.技术方案 二.非静态资源 三.Mock被测对象 1.@Autowired构造方法 2.@Autowired属性对象,无构造方法 3.PowerMock用法 4.共享对象以及初始化 四.定义对象行为 1.Spock定义Mock对象行为 2.Mockito模拟对象行为 前言: 下面分享一些使用过的一个常用项目,部分信息隐去了.大家在自己项目中实践的时候可以参考,尽量别直接抄代码,我自己使用过程中有很多兼容性的坑,特别是IDE自动import功能. 一.技术方案 本技术方案基于公司力推的Sp

  • Java mockito单元测试实现过程解析

    待测试的服务接口: public interface ItemService { String getItemNameUpperCase(String itemId); } 预览 待测试的服务的实现类: @Service public class ItemServiceImpl implements ItemService { @Resource private ItemRepository itemRepository; @Override public String getItemNameU

  • Java单元测试Mockito的使用详解

    Mockito简介 调用mock对象的方法时,不会执行真实的方法,而是返回类型的默认值,如object返回null, int返回0等,否则通过指定when(方法).thenReturn(value)来指定方法的返回值.同时mock对象可以进行跟踪,使用verify方法看是否已经被调用过.而spy对象,默认会执行真实方法,返回值可以通过when.thenReturn进行覆盖.可见mock只要避开了执行一些方法,直接返回指定的值,方便做其他测试. Service测试用例 需要的依赖 <depende

  • Java单元测试Powermockito和Mockito使用总结

    目录 依赖引入 PowerMockito的使用 使用mockito来mock实例 mock对Redis的静态调用 mock单例类 mock私有方法 PowerMock跳过方法执行 总结 参考文档 最近公司在推进Java应用的单元测试,要求将单元测试的覆盖率提高到50%以上,保证上线代码充分自测.公司单元测试框架选用了Junit 4.12,Mock框架选用了Mockito和PowerMock,同时选用JaCoCo来做覆盖率检测,下面详细介绍一下我在使用这几个框架的一些经验. 依赖引入 <depen

  • Java测试框架Mockito的简明教程

    什么是 Mock 测试 Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法. Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为. 比如一段代码有这样的依赖: 当我们需要测试A类的时候,如果

  • 详解Java 中的UnitTest 和 PowerMock

    学习一门计算机语言,我觉得除了学习它的语法外,最重要的就是要学习怎么在这个语言环境下进行单元测试,因为单元测试能帮你提早发现错误:同时给你的程序加一道防护网,防止你的修改破坏了原有的功能:单元测试还能指引你写出更好的代码,毕竟不能被测试的代码一定不是好代码:除此之外,它还能增加你的自信,能勇敢的说出「我的程序没有bug」. 每个语言都有其常用的单元测试框架,本文主要介绍在 Java 中,我们如何使用 PowerMock,来解决我们在写单元测试时遇到的问题,从 Mock 这个词可以看出,这类问题主

  • 基于Java汇总Spock框架Mock静态资源经验

    目录 一.静态方法 二.混合场景 前面讲了Spock框架Mock对象方法经验总结 一.静态方法 Mock静态方法我们使用PowerMock结合Mockito的方案,首先在测试类增加如下注解: @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(Sputnik.class) @PrepareForTest([NewUtil.class, HttpBase.class]) @PowerMockIgnore(["javax.manageme

  • 基于Java的Spring框架来操作FreeMarker模板的示例

    1.通过String来创建模版对象,并执行插值处理 import freemarker.template.Template; import java.io.OutputStreamWriter; import java.io.StringReader; import java.util.HashMap; import java.util.Map; /** * Freemarker最简单的例子 * * @author leizhimin 11-11-17 上午10:32 */ public cla

  • 基于 Node 实现简易 serve静态资源服务器的示例详解

    目录 前言 基础示例 简易 serve 实现 arg - 命令行参数读取 chalk - 控制台信息输出 源码 扩展 rewrite 和 redirect 的区别? 前言 静态资源服务器(HTTP 服务器)可以将静态文件(如 js.css.图片)等通过 HTTP 协议展现给客户端.本文介绍如何基于 Node 实现一个简易的静态资源服务器(类似于 serve). 基础示例 const fs = require("node:fs"); const fsp = require("n

  • Java SSM框架如何配置静态资源加载

    Java SSM框架即指Spring+SpringMVC+MyBatis的简称,框架集由Spring.MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容),常作为数据源较简单的web项目的框架. 相比于之前的SSH(Spring+Struts+Hibernate),SSM更加轻量化和灵活,是目前业界主流的Java Web开发框架. 第一种:SSM框架中在springmvc-servlet.xml中配置加载静态资源 只需要在springmvc-servlet.xml配

  • 基于Java ORM框架的使用详解

    ORM框架不是一个新话题,它已经流传了很多年.它的优点在于提供了概念性的.易于理解的数据模型,将数据库中的表和内存中的对象建立了很好的映射关系.我们在这里主要关注Java中常用的两个ORM框架:Hibernate和iBatis.下面来介绍这两个框架简单的使用方法,如果将来有时间,我会深入的写一些更有意思的相关文章.HibernateHibernate是一个持久化框架和ORM框架,持久化和ORM是两个有区别的概念,持久化注重对象的存储方法是否随着程序的退出而消亡,ORM关注的是如何在数据库表和内存

  • 基于Java class对象说明、Java 静态变量声明和赋值说明(详解)

    先看下JDK中的说明: java.lang.Object java.lang.Class<T> Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class tha

  • 基于Java代码实现游戏服务器生成全局唯一ID的方法汇总

    在服务器系统开发时,为了适应数据大并发的请求,我们往往需要对数据进行异步存储,特别是在做分布式系统时,这个时候就不能等待插入数据库返回了取自动id了,而是需要在插入数据库之前生成一个全局的唯一id,使用全局的唯一id,在游戏服务器中,全局唯一的id可以用于将来合服方便,不会出现键冲突.也可以将来在业务增长的情况下,实现分库分表,比如某一个用户的物品要放在同一个分片内,而这个分片段可能是根据用户id的范围值来确定的,比如用户id大于1000小于100000的用户在一个分片内.目前常用的有以下几种:

  • 基于Java中最常用的集合类框架之HashMap(详解)

    一.HashMap的概述 HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构. HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是对的映射,允许多个null值和一个null键.但此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 除了HashMap是非同步以及允许使用null外,HashMap 类与 Hashtable大致相同. 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性

  • 基于Django静态资源部署404的解决方法

    一. 静态资源static文件放在app中 确认django.contrib.staticfiles包含在INSTALLED_APPS中. 在settings文件中定义STATIC_URL,例如: STATIC_URL = '/static/' 在模板中,可以硬编码URL如/static/my_app/example.jpg,或者最好使用static模板标签通过配置的STATICFILES_STORAGE存储来构建给定相对路径的URL(当你要切换到用于提供静态文件的内容分发网络(CDN)时,这样

随机推荐