Mockito 4.8.0+Java8调用含LocalDate的静态方法报NoSuchMethodError
针对你遇到的java.lang.NoSuchMethodError问题,结合Mockito 4.8.0 + Java 8的环境,从以下几个方向排查:
检查Mockito依赖兼容性与冲突
Mockito 4.x依赖ByteBuddy、Objenesis等工具库,版本不匹配可能引发类加载异常。执行mvn dependency:tree查看依赖树,排查是否存在这些依赖的版本冲突,确保其版本与Mockito 4.8.0兼容(Mockito 4.8.0对应的ByteBuddy版本应为1.12.18左右)。若发现冲突,在pom.xml中显式指定兼容版本。确认编译与运行的字节码版本一致
保证maven编译插件的source和target参数都设置为1.8,避免编译时使用更高版本的Java语法或字节码,导致Java 8环境运行时出现方法不匹配:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin>执行
mvn clean compile test-compile重新编译所有代码。排查静态方法类的类加载问题
由于Utils.method()是静态方法,测试环境中Mockito的类加载器可能与应用类加载器存在隔离。如果测试中使用了Mockito.mockStatic(Utils.class),需确保mock的方法签名与实际完全一致(包括参数类型java.time.LocalDate),且在测试结束后清理静态mock:try (MockedStatic<Utils> mockedUtils = Mockito.mockStatic(Utils.class)) { mockedUtils.when(() -> Utils.method(any(LocalDate.class))).thenReturn(...); // 测试逻辑 }若未mock静态方法,需确认
Utils类在测试类路径中仅存在一个版本,避免类加载时因重复类导致方法找不到。验证LocalDate的类来源一致性
确保代码中使用的LocalDate是Java 8自带的java.time.LocalDate,而非第三方库(如Joda-Time的org.joda.time.LocalDate)。检查测试类和业务类的import语句,避免引入错误的LocalDate类。清理并重新构建依赖
执行mvn clean install -U强制更新快照依赖,同时删除本地仓库中可能损坏的依赖包(默认路径~/.m2/repository),重新下载所有依赖后再运行测试。
内容的提问来源于stack exchange,提问作者Pier Zegarra Reymundo

