现在我们能否使用Mockito 2来模拟静态方法?

8

我看到Mockito 2不再使用CGLIB/proxy,而是使用ByteBuddy来创建模拟对象。这是不是意味着现在可以模拟静态方法和私有方法了?


Mockito的开发者们目前还没有添加对static方法的模拟支持,但是他们很可能会在未来版本中加入。毕竟,这可以基本上以与已经完成的final模拟相同的方式完成。 - Rogério
拿出爆米花,热切地观看。 - vikingsteve
2个回答

8

不,你不能(在这里查看他们的文档here; 我确定他们会提到这个)。

因此,PowerMock(ito)和JMockit是支持模拟静态方法的两个模拟框架。

但是,个人意见是:尽管可以编写代码使用PowerMock进行测试,但还是应该优先选择使用Mockito;并且不需要PowerMock。我的意思是:当您编写自己的代码并认为您需要模拟静态调用时,那么您正在编写难以测试的代码。

答案不是寻找强大的模拟框架,而是编写易于测试的代码。 您可以观看这些视频以了解如何做到这一点。

最后:不要认为PowerMockito是一个好的替代品。Mockito现在已经是2.79版本(截至2017年3月)。但是,当你看一下PowerMockito时,你会发现它带有一些Mockito 2.0.42 beta的东西——因为PowerMockito的人无法让他们的工具与任何更新版本的Mockito配合使用。这是一件遗憾的事情,因为这些新的Mockito版本有很多有趣的功能。

严肃地说,这个答案完全错误!Mockito 添加了final mocking 作为一个可选功能。它使用了一个Java agent(实际上是java.lang.instrument API),这与JMockit相同的基本机制,另一个支持mocking statics等功能的 mocking 库,你也知道但“忘记”提到了。PowerMock从来不是唯一的,因为JMockit从2006年开始就一直在做这件事。最后,Mockito添加static mocking只是时间问题。 - Rogério
只是为了澄清给其他读者:我开发了JMockit,并且之前有几次向@GhostCat评论过它。所以,他选择故意谎称PowerMock是(根据他的说法)唯一没有限制的模拟库,这真是遗憾。除此之外,他还反复(请参见他在SO中的其他答案)试图贬低PowerMock - PowerMock可能存在问题,但它不应该受到这样的待遇。 - Rogério
@Rogério 无论如何...如果你有兴趣,我们可以商定一个日期坐下来聊一会儿。我猜你有很好的理由和经验,这让你捍卫PowerMock;但是我在使用这个工具方面积累了很多经验;它只是花费了我(以及我周围的团队)比我们从其“独特卖点”中获得的更多的时间。所以,当你对更多的事情感兴趣而不仅仅是放弃那些“GhostCat是骗子”的评论时......给我留言;让我们看看是否可以聊聊...... - GhostCat
让我们逐一来看:JMockit支持静态模拟的信息,也从未到达我的高级大脑区域。我为此道歉;请放心,我不会再“撒谎”了。但是,我已经进行了超过5年的密集单元测试。最初我们使用PowerMock开始。我们模拟了静态内容。有很多情况下,一个PowerMocked测试突然失败了 - 而没有直接测试类被更改。但是某些静态的东西在其他地方发生了变化,与该类相关。而且我想我已经提到过了... - GhostCat
只需进入这里的powermock标记问题,你会发现有几个描述非常奇怪的问题。我不是唯一一个遇到这种情况的人。为了记录:在我们几天前的讨论之后,我转向了“java专家”网站上的slack频道...快速随机调查:那里的每个人都反对静态模拟。也就是说,有灰色地带。当然,理想情况下,你编写的代码可以在没有任何模拟的情况下进行测试。但是有很多场合是不可能的。但是,还有一些不错的,“非侵入式”的简单方法... - GhostCat
显示剩余8条评论

-2

我编写了Mockito 2的一个扩展,它使用AspectJ允许模拟甚至像静态/私有/最终方法这样的东西,只需一个简单的基于lambda的语法,例如:

when(() -> YourClass.staticMethodToCall(...)).thenReturn(...)


这个 Mockito 2 扩展的 ajmock GitHub 存储库 不再可用,似乎已被删除,因为我没有在其他地方找到它作为移动/重命名/克隆存储库。 - Sylvain Bugat
该代码库不再可用。 - Rafid
是的。这个仓库似乎消失了,你能发布一个更新的位置吗? - Pedro Rodrigues
我修复了那个损坏的链接。 - iirekm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接