@@ -28,9 +28,12 @@ import org.mockito.stubbing._
2828import org .mockito .verification .{ VerificationAfterDelay , VerificationMode , VerificationWithTimeout }
2929import org .scalactic .{ Equality , Prettifier }
3030
31+ import java .lang .reflect .Field
3132import scala .collection .JavaConverters ._
3233import scala .reflect .ClassTag
3334import scala .reflect .runtime .universe .WeakTypeTag
35+ import scala .util .{ Failure , Success , Try }
36+ import scala .util .control .Breaks .break
3437
3538private [mockito] trait ScalacticSerialisableHack {
3639 // Hack until Equality can be made serialisable
@@ -630,7 +633,24 @@ private[mockito] trait MockitoEnhancer extends MockCreator {
630633 def withObjectMocked [O <: AnyRef : ClassTag ](block : => Any )(implicit defaultAnswer : DefaultAnswer , $pt : Prettifier ): Unit = {
631634 val objectClass = clazz[O ]
632635 objectClass.synchronized {
633- val moduleField = objectClass.getDeclaredField(" MODULE$" )
636+ val moduleField : Field = Try (objectClass.getDeclaredField(" MODULE$" )) match {
637+ case Success (module) => module
638+ case Failure (e) =>
639+ Try {
640+ val getDeclaredFields0 = objectClass.getDeclaredMethod(" getDeclaredFields0" , classOf [Boolean ])
641+ val accessibleBeforeSet : Boolean = getDeclaredFields0.isAccessible
642+ getDeclaredFields0.setAccessible(true )
643+ val declaredFields : Array [Field ] = getDeclaredFields0.invoke(classOf [Field ], () => false ).asInstanceOf [Array [Field ]]
644+ getDeclaredFields0.setAccessible(accessibleBeforeSet)
645+ declaredFields.find(" MODULE$" == _.getName).get
646+ } match {
647+ case Success (module) => module
648+ case Failure (ex) =>
649+ e.addSuppressed(ex)
650+ throw e
651+ }
652+ }
653+
634654 val realImpl : O = moduleField.get(null ).asInstanceOf [O ]
635655
636656 val threadAwareMock = createMock(
0 commit comments