mockito-core 与 mockito-inline 之间的区别

mal*_*ikh 10 junit unit-testing mockito

在我的项目中,我们已经有了 mockito-core 依赖项。我想存根静态方法,我需要为其添加模拟内联依赖项。所以想了解一下它们之间的区别。它们可以共存吗?

bea*_*u13 12

从Mockito 5.0.0开始,mockito-inline是默认的模拟制作者:

这个mockmaker [mockito-inline]创建模拟操作原始类中等效的字节码,以便其方法实现挂钩到正常的Mockito机制。作为比较,子类mockmaker为模拟生成“真正的”子类,以模仿相同的行为。虽然方法相似,但内联模拟制作器避免了 JDK 施加的某些限制。例如,它不会违反模块边界(在 JDK 9 中引入,但在 JDK 17 中使用较多),并避免子类创建的泄漏。

mockito-inline 一个独立的、免配置的工件。(如果您想使用内联模拟制作,则mockito-core,必须配置 MockMaker 扩展文件。)但是,从Mockito 5.3.0开始,mockito-inline 不再发布!

如果您想(或必须)在 5.0.0 之后使用子类模拟制作,那么又一个单独的、免配置的工件:mockito-subclass

子类模拟制作者还有合法的剩余用例。例如,在 Graal VM 的本机映像上,内联mockmaker将不起作用,子类mockmaker是合适的选择。此外,如果您想避免模拟最终类,可以使用子类mockmaker。但请注意,如果您只想使用子类mockmaker来避免模拟final,您将在JDK 17+上遇到上述问题。我们希望将这个选择权留给我们的用户,这就是为什么我们将继续支持子类mockmaker。


Pra*_*oda 7

根据 3.7.7 版的最新文档,看起来 mockito 社区已经为一些实验性功能提供了 mockito-inline,例如模拟最终类和方法、模拟静态方法等。因此,一旦他们从社区获得反馈,他们就会将这些更改合并到mockito-core 并废除了 mockito-inline。最终它只会是 mockito-core。

https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#mockito-inline https://javadoc.io/static/org.mockito/mockito-core/3.7 .7/org/mockito/Mockito.html#39

  • 如何在mockito核心中启用模拟静态方法? (2认同)
  • 根据此链接,您似乎仍然需要使用 Mockito 内联进行静态模拟。https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#static_mocks (2认同)
  • @Ijaz 创建一个名为“mockito-extensions/org.mockito.plugins.MockMaker”的资源,其中包含“mock-maker-inline”内容。请参阅 https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2#mock-the-unmockable-opt-in-mocking-of-final-classesmethods。 (2认同)