专栏首页软件测试那些事让PowerMock正在远去的,竟然是

让PowerMock正在远去的,竟然是

昨天天去github上的PowerMock 项目去看了一下。这个项目上次的commit和发布已经是10个月之前了。还积攒了400个问题和13个PR没有合并。当然,作为一个出道很久的小众Mock工具的项目,本身的活跃度低也是比较正常的。不过,很多Issue其实是关于新JDK兼容性的。从这点上看,维护者已经不是在积极维护这个项目了。

而造成这些问题的一个重要因素,其实和JUnit5有关。

众所周知,Mockito采用的是所谓动态代理的方式来实现mocking的,这种机制也因此让Mockito无法去模拟 静态或者final的类型或者方法(2.0之前),否则会出现类似以下的错误,

you stub either of: final/private/equals()/hashCode() methods.

Those methods *cannot* be stubbed/verified.

Mocking methods declared on non-public parent classes is not supported.

这类的需求催生了PowerMock这样强大的模拟工具,可以通过自定义的类加载器来实现上述需求。因此,在JUnit4的时代,Mockito+PowerMock成为了一个单元测试模拟工具的黄金搭档。

然而,当JUnit5问世之后,作为Java单元测试框架的默认选择,PowerMock积极主动拥抱JUnit5。然而这样的姿态,并没有打动Junit团队。早在2016年,在JUnit5尚未正式发布时,PowerMock团队就对JUnit团队提出了兼容PowerMock的需求(

https://github.com/junit-team/junit5/issues/201 https://github.com/junit-team/junit5/issues/201

,指出由于Junit5不允许客制化的类加载器,因此JUnit4中通过Rule机制进行Mock类加载的PowerMock MockClassLoader无法在JUnit5中直接使用,需要JUnit团队对JUnit5进行修改。

而JUnit团队认为PowerMock的实现机制侵入性太强,并且属于小众需求,因此该需求历时5年多了一直没有实现。

Mockito的乘势而入

而Mockito团队则看到了这个机会,实现了Mockito功能的突破,进入了原先PowerMock的领域。根据Mockito.org的说法,Mockito从2.1支持mock final类型和方法。Rafael Winterhalter在Mockito 2.1.0版本里创建了一种叫做Inline mock maker的 mock方法,突破了上述限制。并且从Mockito2.7.6版本开始,可以不再需要添加配置文件而只需要在project POM中用"mockito-inline"的artifact替换掉"mockto-core"的artifact,就直接使用免配置的inline mock making。

 <dependency>
    <groupId>org.mockito</groupId>
     <artifactId>mockito-inline</artifactId>
     <version>3.3.3</version>
 </dependency>

不过根据目前的官网说明,该特性仍旧处于向社区征求意见的阶段。如果最终该子项目成熟,被吸收进Mockito的正式项目,依托Mockito-core项目的巨大下载量,以及在SpringBoot-test-starter中的默认mock框架的优势,这个项目还是有取代PowerMock的机会。

于是,这对在Junit4时代的黄金搭档,终于还是在JUnit5时代分道扬镳,各奔前程了。感兴趣的读者可以到Junit5项目中为PowerMock团队的这个需求投票,协助PowerMock团队拿到通向未来的船票。只是这艘渐行渐远的船上,早就有了新的明星。

“Old soldiers never die, they just fade away”

文章分享自微信公众号:
软件测试那些事

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:风月同天测试人
原始发表时间:2021-08-28
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Mocktio 使用(下)

    thenReturn 用来指定特定函数和参数调用的返回值。thenReturn 中可以指定多个返回值,在调用时返回值依次出现。若调用次数超过返回值的数量,再次调...

    HLee
  • 谷歌正在研究能够让计算机合成语音更加自然的技术 | 黑科技

    镁客网
  • 没有饭局的世界互联网大会,才是真大会

    我一直都认为,饭局与互联网两种东西是完全相悖的。因为互联网是开放的、共享的,而饭局则是封闭的、私密的。如果世界互联网大会的焦点不在互联网本身,而在于饭局,那么,...

    孟永辉
  • android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

    在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity,

    全栈程序员站长
  • Powermock系列之-01 Powermock与Thead.sleep

    笔者在对某个JAVA socket通信程序进行UT的时候,遇到过以下一个场景,客户端发出登陆请求,然后每隔500ms监查一下底层通信机的登陆状态,如果登陆成功,...

    Antony
  • 玩花招的PowerMock

    当我们面对一个遗留系统时,常见的问题是没有测试。正如Michael Feathers在Working Effectively with Legacy Code一...

    Allen Cheng
  • Mockito和PowerMock用法

    在单元测试中,我们往往想去独立地去测一个类中的某个方法,但是这个类可不是独立的,它会去调用一些其它类的方法和service,这也就导致了以下两个问题:外部服务可...

    一滴水的眼泪
  • 使用PowerMock进行单元测试

    单元测试可以提高测试开发的效率,减少代码错误率,提高代码健壮性,提高代码质量。在Spring框架中常用的两种测试框架:PowerMockRunner和Sprin...

    Dream城堡
  • Spock单元测试框架以及在美团优选的实践

    Spock是国外一款优秀的测试框架,基于BDD(行为驱动开发)思想实现,功能非常强大。Spock结合Groovy动态语言的特点,提供了各种标签,并采用简单、通用...

    美团技术团队
  • Mockito模拟进行单元测试

    MOCK意思是模拟的意思,主要被用来进行数据的人工组织,不会真正地调用第三方服务器,类似redis,mysql等都不会调用,也不用关心数据底层是如何进行...

    chinotan
  • Mockito模拟进行单元测试

        MOCK意思是模拟的意思,主要被用来进行数据的人工组织,不会真正地调用第三方服务器,类似redis,mysql等都不会调用,也不用关心数据底层是如何进行...

    chinotan
  • Spock单元测试框架以及在美团优选的实践

    Spock是国外一款优秀的测试框架,基于BDD(行为驱动开发)思想实现,功能非常强大。Spock结合Groovy动态语言的特点,提供了各种标签,并采用简单、通用...

    测试开发社区
  • 区块链风口已至

    区块链行业发展到2018年中,ICO泡沫已经彻底破裂,技术发展和价值创造又一次成为了行业的主流观点,政策的暖风又开始频吹。继贵阳之后,包括杭州、青岛、杭州、广州...

    用户2357564
  • 单元测试框架spock和Mockito应用

    spock是一款基于Groovy语言的单元测试框架,其基础也是Java的Junit,目前最新版已经到了2.0,但对Groovy和响应的Java版本要求较高,具体...

    FunTester
  • 你正在用却不知道它们让微信比其它社交App更强大的6大功能

      微信二维码、摇一摇、微信雷达、语音对讲、漂流瓶、微信红包,这些功能大伙玩得不爱玩了,但正是这六大功能让微信比其它社交App更强大!   1、二维码(QR C...

    ytkah
  • Android开发之逻辑单元测试

    以上createInetSocketAddress方法就是我在编写单元测试的时候单独抽离出来的方法,一方面我需要mock一个InetSocketAddress来...

    大大大大大先生
  • 使用强大的 Mockito 来测试你的代码

    这篇教程介绍了如何使用 Mockito 框架来给软件写测试用例。 1、预备知识 如果需要往下学习,你需要先理解 Junit 框架中的单元测试。 如果你不熟悉 J...

    用户1332428
  • 像 google 一样测试系列之四:技术篇

    Android 白盒测试覆盖率低的最主要原因,是大部分人都没有测到 Android 层,只测试了Java层部分,导致覆盖率低。亲,你是不是认为Android层的...

    腾讯移动品质中心TMQ

扫码关注腾讯云开发者

领取腾讯云代金券