在项目中使用mockito-inline会抛出“Mockito无法模拟此类”错误

问题描述 投票:0回答:2

我在我的项目中使用 Mockito 2.23.4 和 byte-buddy 1.9.3。我想模拟最终类和方法,所以我在这篇文章Mockito模拟最终类和方法之后使用了mockito-inline,并在项目的

mock-maker-inline
目录中的
org.mockito.plugins.MockMaker
文件中设置
src/test/resources/mockito-extensions
。 我还跟进了帖子Mockito因无效参数名称异常而启用内联模拟而失败,但问题仍然存在。 但是当我运行测试时,我得到下面的堆栈跟踪。

Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

Test ignored.

org.mockito.exceptions.base.MockitoException: 
Mockito cannot mock this class: class org.elasticsearch.client.RestHighLevelClient.

If you're not sure why you're getting this error, please report to the mailing list.


Java               : 15
JVM vendor name    : Oracle Corporation
JVM vendor version : 15.0.2+7-27
JVM name           : Java HotSpot(TM) 64-Bit Server VM
JVM version        : 15.0.2+7-27
JVM info           : mixed mode, sharing
OS name            : Windows 10
OS version         : 10.0


You are seeing this disclaimer because Mockito is configured to create inlined mocks.
You can learn about inline mocks and their limitations under item #39 of the Mockito class javadoc.

Underlying exception : org.mockito.exceptions.base.MockitoException: Could not modify all classes [class org.elasticsearch.client.RestHighLevelClient, class java.lang.Object, interface java.io.Closeable, interface java.lang.AutoCloseable]

    at org.mockito.internal.runners.DefaultInternalRunner$1.withBefores(DefaultInternalRunner.java:39)
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:276)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:79)
    at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:85)
    at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
    at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: org.mockito.exceptions.base.MockitoException: Could not modify all classes [class org.elasticsearch.client.RestHighLevelClient, class java.lang.Object, interface java.io.Closeable, interface java.lang.AutoCloseable]
    at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:152)
    at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:365)
    at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:174)
    at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:376)
    ... 19 more
Caused by: java.lang.IllegalStateException: 
Byte Buddy could not instrument all classes within the mock's type hierarchy

This problem should never occur for javac-compiled classes. This problem has been observed for classes that are:
 - Compiled by older versions of scalac
 - Classes that are part of the Android distribution
    at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.triggerRetransformation(InlineBytecodeGenerator.java:164)
    at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.mockClass(InlineBytecodeGenerator.java:141)
    at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:37)
    at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:34)
    at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:152)
    at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:365)
    at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:174)
    at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:376)
    at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator.mockClass(TypeCachingBytecodeGenerator.java:32)
    at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.createMockType(InlineByteBuddyMockMaker.java:200)
    at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.createMock(InlineByteBuddyMockMaker.java:181)
    at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:35)
    at org.mockito.internal.MockitoCore.mock(MockitoCore.java:69)
    at org.mockito.Mockito.mock(Mockito.java:1896)
    at org.mockito.internal.configuration.MockAnnotationProcessor.processAnnotationForMock(MockAnnotationProcessor.java:44)
    at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:19)
    at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)
    at org.mockito.internal.configuration.IndependentAnnotationEngine.createMockFor(IndependentAnnotationEngine.java:38)
    at org.mockito.internal.configuration.IndependentAnnotationEngine.process(IndependentAnnotationEngine.java:62)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:57)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:41)
    at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:69)
    ... 19 more
Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 59
    at net.bytebuddy.jar.asm.ClassReader.<init>(ClassReader.java:184)
    at net.bytebuddy.jar.asm.ClassReader.<init>(ClassReader.java:166)
    at net.bytebuddy.jar.asm.ClassReader.<init>(ClassReader.java:152)
    at net.bytebuddy.utility.OpenedClassReader.of(OpenedClassReader.java:82)
    at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForInlining.create(TypeWriter.java:3390)
    at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:1930)
    at net.bytebuddy.dynamic.scaffold.inline.RedefinitionDynamicTypeBuilder.make(RedefinitionDynamicTypeBuilder.java:207)
    at net.bytebuddy.dynamic.scaffold.inline.AbstractInliningDynamicTypeBuilder.make(AbstractInliningDynamicTypeBuilder.java:116)
    at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:3394)
    at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.transform(InlineBytecodeGenerator.java:215)
    at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246)
    at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
    at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:563)
    at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
    at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:167)
    at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.triggerRetransformation(InlineBytecodeGenerator.java:161)
    ... 40 more

我尝试按照帖子中提到的 byte-buddy 的依赖项设置mockito 因内联模拟而失败

        <dependency>
            <groupId>net.bytebuddy</groupId>
            <artifactId>byte-buddy</artifactId>
            <version>LATEST</version>
        </dependency>

但仍然没有成功解决错误。我的测试代码和实际方法在我之前的帖子中提到:尝试在 Mockito 中模拟 ElasticClient 时出现 NPE 错误 [重复]

接下来我可以尝试什么?

java unit-testing junit mockito byte-buddy
2个回答
7
投票

您需要更新您的依赖项。

您正在使用jdk15编译您的项目。 Bytebuddy 抱怨它无法检测此 jdk 生成的类文件(不支持的类文件主要版本 59)

ByteBuddy 版本 1.10.6 中引入了对 java 15 的支持

请注意,您不需要在项目中指定 ByteBuddy 的版本,因为 Mockito 会传递性地拉取它(除非您有充分的理由强制使用版本)。

Mockito 3.3.10 中引入了兼容的 ByteBuddy 版本。请参阅提交将 ByteBuddy 版本更改为 1.10.10

我建议不要分析 Mockito 中的提交历史,而是选择最新和最好的版本(撰写本文时为 3.8.0)


0
投票

我在我的项目中添加了这个依赖项:

testImplementation("org.mockito:mockito-core:5.2.0")
testImplementation ("org.mockito.kotlin:mockito-kotlin:5.4.0")

对我来说,即使我从资源文件夹中删除了文件 org.mockito.plugins.MockMaker,它仍然可以工作。我使用Android studio:瓢虫| 2024.2.1 补丁 2

© www.soinside.com 2019 - 2024. All rights reserved.