JDK1.8环境下PowerMock与Mockito版本不兼容问题求助
问题分析与解决方案
错误原因
你遇到的java.lang.NoSuchMethodError: org.mockito.Mockito.framework()Lorg/mockito/MockitoFramework;是版本兼容冲突导致的:
- PowerMock 2.0.9依赖的是Mockito 2.x版本,而
Mockito.framework()方法是Mockito 2.x才新增的API; - 你当前使用的
mockito-all:1.10.19属于Mockito 1.x系列,根本没有这个方法,因此触发了方法找不到的错误。
两种方案都可以解决这个问题,具体选择取决于你是否愿意改动现有Mockito测试代码:
方案一:升级Mockito版本(推荐)
Mockito 2.x之后已经不再维护mockito-all这个聚合依赖,建议替换为mockito-core,同时选择和PowerMock 2.0.9兼容的Mockito版本(PowerMock 2.0.9支持Mockito 2.8.47~3.3.3区间版本,推荐选2.28.2)。
调整后的POM依赖如下:
<!-- 替换原有的mockito-all,使用Mockito 2.x的核心依赖 --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.28.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-testng</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency>
注意:如果项目中有其他依赖间接引入旧版Mockito,建议通过
dependencyManagement锁定版本,避免冲突。
方案二:降级PowerMock适配现有Mockito版本
如果不想改动现有基于Mockito 1.x的测试代码,可以降级PowerMock到支持Mockito 1.x的版本,使用powermock-api-mockito(而非mockito2),推荐版本为1.7.4(完美兼容Mockito 1.10.19)。
调整后的POM依赖如下:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.10.19</version> <scope>test</scope> </dependency> <!-- 降级PowerMock到1.7.4,适配Mockito 1.x --> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-testng</artifactId> <version>1.7.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>1.7.4</version> <scope>test</scope> </dependency> <!-- 替换为支持Mockito 1.x的API依赖 --> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>1.7.4</version> <scope>test</scope> </dependency>
注意:你同时引入了TestNG和JUnit4的PowerMock模块,实际只需要保留项目使用的测试框架对应的模块即可,避免冗余依赖。
内容的提问来源于stack exchange,提问作者TechGoose
相关产品推荐
相关产品推荐

