服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 基于Java汇总Spock框架Mock静态资源经验

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

2022-07-20 12:52FunTester Java教程

这篇文章主要介绍了基于Java汇总Spock框架Mock静态资源经验,前面讲了 Spock框架Mock对象、方法经验总结,今天分享一下Spock框架中Mock静态资源的实践经验汇总。分成静态资源和混合场景,需要的朋友可以参考一下

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

一、静态方法

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

?
1
2
3
4
5
@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,语法如下:

?
1
2
PowerMockito.mockStatic(HttpBase.class)
PowerMockito.mockStatic(NewUtil.class)

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

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

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

二、混合场景

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

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

Demo如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
@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静态资源经验汇总内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.51cto.com/FunTester/4957444

延伸 · 阅读

精彩推荐
  • Java教程使用@Value值注入及配置文件组件扫描

    使用@Value值注入及配置文件组件扫描

    这篇文章主要介绍了使用@Value值注入及配置文件组件扫描方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    还是转转11032021-09-30
  • Java教程基于JVM性能监控命令介绍

    基于JVM性能监控命令介绍

    下面小编就为大家带来一篇基于JVM性能监控命令介绍。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    anqli_java11202021-01-11
  • Java教程2021年,为什么还要学习Java?

    2021年,为什么还要学习Java?

    如今互联网蓬勃发展,继JAVA,C++之后又出现了许多其他的语言,大继出现了许多可行可靠的语言,每种语言也都会有各自的优点以及缺点,那么如果有新的...

    今日头条12142021-03-03
  • Java教程Java并发实例之CyclicBarrier的使用

    Java并发实例之CyclicBarrier的使用

    这篇文章主要介绍了Java并发实例之CyclicBarrier的使用,涉及CyclicBarrier的介绍,以及相关的并发实例,具有一定参考价值,需要的朋友可以了解下。...

    生活半篇记9132021-02-05
  • Java教程Java 从网上下载文件的几种方式实例代码详解

    Java 从网上下载文件的几种方式实例代码详解

    本文通过实例代码给大家介绍了java从网上下载文件的几种方式,非常不错,具有参考借鉴价值,需要的的朋友参考下吧...

    Java之家3822020-12-22
  • Java教程理解Java垃圾回收

    理解Java垃圾回收

    这篇文章主要帮助大家理解Java垃圾回收,通过实例学习java垃圾回收,什么是垃圾回收,感兴趣的小伙伴们可以参考一下 ...

    赵杰A-1241922020-04-13
  • Java教程Java使用GUI绘制线条的示例

    Java使用GUI绘制线条的示例

    这篇文章主要介绍了Java使用GUI绘制线条的示例,帮助大家更好的理解和学习java gui编程,感兴趣的朋友可以了解下...

    初生不惑3692020-09-23
  • Java教程Java GUI制作简单的管理系统

    Java GUI制作简单的管理系统

    这篇文章主要为大家详细介绍了Java GUI制作简单的管理系统的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    -小龙人12142021-03-18