Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon 与Mockito一起使用PowerMock时,有什么常见问题


与Mockito一起使用PowerMock时,有什么常见问题


当将PowerMock与Mockito一起使用时,由于其集成复杂性,可能会出现一些常见问题。以下是这些问题的一些详细说明:

##不兼容的版本
主要挑战之一是确保Mockito和PowerMock的版本兼容。例如,PowerMock版本1.7.0 RC2与Mockito版本2.1.0 [1] [4]兼容。使用不兼容的版本可能会导致错误,例如`java.lang.noclang.noclassdeffounderror`或`java.lang.lang.classnotfoundexception“,因为PowerMock都依赖于内部模仿API,这些API会在版本之间发生变化[1] [4]。

Mockito API扩展

PowerMock需要正确的Mockito API扩展名才能与Mockito 2.x正确使用。 `powermock-api-mockito`扩展名与Mockito 2.x不起作用,并且会引起诸如`java.lang.noclang.noclassdeffounderror:org/mockito/cglib/cglib/proxy/proxy/methotceypector`。相反,您应该使用`powermock-api-mockito2`避免这些问题[1] [4]。

WhiteBox删除

Mockito 2.x不再包含WhiteBox功能,该功能用于设置内部对象状态。 PowerMock提供了自己的WhiteBox,但是使用它可能会导致诸如`org.powermock.reflect.exceptions.fieldnotfoundexception“”等问题。如果PowerMock的Whitebox对您不起作用,请考虑编写自己的实现[1] [4]。

Mockmaker配置

PowerMock实现了自己的“ Mockmaker”,如果两者都存在于Class Path中,则可能与Mockito的“ Mock-Maker-Inline”冲突。为了解决这个问题,您可以通过在配置文件中设置``oighito.mock-maker-class = oight-maker-class = oight-maker-inline''将PowerMock配置为Mockito的“ MockMaker” [3]。

##例外处理
当将PowerMock与Mockito 2.X一起使用时,原始测试异常被包裹为“ RuntimeExceptionProxy”。这需要从@test(endure = someException.class)``@testes(Exceence = excepre = except.Class''修改测试注释。

##与其他框架集成
PowerMock可能会与其他框架或库(例如Spring或某些Java版本)冲突,因为其字节码操纵技术[9]。这可能会导致测试执行速度较慢和管理依赖性方面的额外复杂性[9]。

##复杂性和性能
PowerMock的高级功能具有增加的复杂性和由于字体上的操纵而导致的测试执行速度较慢。与仅使用Mockito相比,这可能会使测试更难设置和维护[9]。

总体而言,尽管PowerMock提供了强大的模拟功能,尤其是对于旧版代码或复杂的静态方法,但它需要仔细的设置和管理,以避免与Mockito和其他框架的集成问题。

引用:
[1] https://dzone.com/articles/mockito-2x-over-powermock migration-top-top-10-tips-and-tricks
[2] https://stackoverflow.com/questions/43669909/powermock-fails-tests
[3] https://github.com/powermock/powermock/wiki/mockito
[4] https://proandroiddev.com/mockito-2-x-x-over-powermock migration-tips-tips-and-tricks-top-top-top-top-ten-118c52abd1d8
[5] https://github.com/powermock/powermock/issues/811
[6] https://stackoverflow.com/questions/6036450/powermock-mockito-vs-mockito-alone
[7] https://github.com/mockk/mockk/issues/79
[8] https://objectcomputing.com/resources/publications/sett/september-2010-mockito-integration-testing-made-made-easier
[9] https://www.javacodegeeks.com/2024/12/mockito-vs-powermock-which-nich-one-one-one-to-choose-choose-for-mocking static-methods.html