You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级mockito-scala后无法Mock返回scala.xml.Elem的方法

Mockito-Scala升级后无法mock返回scala.xml.Elem的方法问题

升级mockito-scala到1.17.29版本(也曾尝试指定mockito-core为2.22.0)后,运行测试时出现Mockito报错,提示无法mock scala.xml.Elem类。

奇怪的是,我并没有让Mockito去mock scala.xml.Elem的实例,只是需要mock一个返回该类型的方法。但如果把返回的Elem对象包装在case class里返回,Mockito就能正常工作。

最小复现代码

import org.mockito.MockitoSugar
import org.scalatest.matchers.must.Matchers
import org.scalatest.wordspec.AnyWordSpec

import scala.xml.Elem

trait ReturnsXml {
  def respond(): Elem
  def respondWrapped(): Wrapper
}

case class Wrapper(value: Elem)

class IssueSpec extends AnyWordSpec with Matchers with MockitoSugar {
  val generator = mock[ReturnsXml]

  "Mockito" should {
    "be able to mock a class" that {
      "returns a wrapped scala.xml value" in {
        /* WORKS */
        when(generator.respondWrapped()).thenReturn(Wrapper(<empty/>))
        generator.respondWrapped() mustBe Wrapper(<empty/>)
      }

      "returns a scala.xml value" in {
        /* ERRORS */
        when(generator.respond()).thenReturn(<empty/>)
        generator.respond() mustBe <empty/>
      }
    }
  }
}

报错信息

[info]   - returns a scala.xml value *** FAILED ***
[info]     org.mockito.exceptions.base.MockitoException: Mockito cannot mock this class: class scala.xml.Elem.
[info] 
[info] Mockito can only mock non-private & non-final classes.
[info] If you're not sure why you're getting this error, please report to the mailing list.
[info] 
[info] 
[info] Java               : 11
[info] JVM vendor name    : AdoptOpenJDK
[info] JVM vendor version : 11.0.9.1+1
[info] JVM name           : OpenJDK 64-Bit Server VM
[info] JVM version        : 11.0.9.1+1
[info] JVM info           : mixed mode
[info] OS name            : Linux
[info] OS version         : 5.4.0-167-generic
[info] 
[info] 
[info] Underlying exception : java.lang.IllegalStateException: java.lang.VerifyError: class scala.xml.Elem$MockitoMock$MKld2yOT overrides final method scala.collection.AbstractSeq.concat(Lscala/collection/IterableOnce;)Ljava/lang/Object;
[info]     at scala.Option.orElse(Option.scala:477)
[info]     at IssueSpec.$anonfun$new$3(IssueSpec.scala:22)
[info]     at org.scalatest.OutcomeOf.outcomeOf(OutcomeOf.scala:85)
[info]     at org.scalatest.OutcomeOf.outcomeOf$(OutcomeOf.scala:83)
[info]     at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info]     at org.scalatest.Transformer.apply(Transformer.scala:22)
[info]     at org.scalatest.Transformer.apply(Transformer.scala:20)
[info]     at org.scalatest.wordspec.AnyWordSpecLike$$anon$3.apply(AnyWordSpecLike.scala:1076)
[info]     at org.scalatest.TestSuite.withFixture(TestSuite.scala:196)
[info]     at org.scalatest.TestSuite.withFixture$(TestSuite.scala:195)
[info]     ...
[info]     Cause: java.lang.IllegalStateException: java.lang.VerifyError: class scala.xml.Elem$MockitoMock$MKld2yOT overrides final method scala.collection.AbstractSeq.concat(Lscala/collection/IterableOnce;)Ljava/lang/Object;
[info]     at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$UsingUnsafeInjection.defineClass(ClassInjector.java:1045)
[info]     at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.injectRaw(ClassInjector.java:284)
[info]     at net.bytebuddy.dynamic.loading.ClassInjector$AbstractBase.inject(ClassInjector.java:118)
[info]     at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$InjectionDispatcher.load(ClassLoadingStrategy.java:241)
[info]     at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:101)
[info]     at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:6166)
[info]     at org.mockito.internal.creation.bytebuddy.SubclassBytecodeGenerator.mockClass(SubclassBytecodeGenerator.java:289)
[info]     at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator.lambda$mockClass$0(TypeCachingBytecodeGenerator.java:47)
[info]     at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:168)
[info]     at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:399)
[info]     ...
[info]     Cause: java.lang.VerifyError: class scala.xml.Elem$MockitoMock$MKld2yOT overrides final method scala.collection.AbstractSeq.concat(Lscala/collection/IterableOnce;)Ljava/lang/Object;
[info]     at java.base/java.lang.ClassLoader.defineClass1(Native Method)
[info]     at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
[info]     at java.base/java.lang.ClassLoader$ByteBuddyAccessor$V1.defineClass(Unknown Source)
[info]     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[info]     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[info]     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[info]     at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[info]     at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$UsingUnsafeInjection.defineClass(ClassInjector.java:1041)
[info]     at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.injectRaw(ClassInjector.java:284)
[info]     at net.bytebuddy.dynamic.loading.ClassInjector$AbstractBase.inject(ClassInjector.java:118)

疑问

这是Mockito-Scala的bug,还是我操作有误?另外我已在对应仓库提交了该问题。


内容的提问来源于stack exchange,提问作者glidester

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:34:50