@@ -28,9 +28,12 @@ import org.mockito.stubbing._
28
28
import org .mockito .verification .{ VerificationAfterDelay , VerificationMode , VerificationWithTimeout }
29
29
import org .scalactic .{ Equality , Prettifier }
30
30
31
+ import java .lang .reflect .Field
31
32
import scala .collection .JavaConverters ._
32
33
import scala .reflect .ClassTag
33
34
import scala .reflect .runtime .universe .WeakTypeTag
35
+ import scala .util .{ Failure , Success , Try }
36
+ import scala .util .control .Breaks .break
34
37
35
38
private [mockito] trait ScalacticSerialisableHack {
36
39
// Hack until Equality can be made serialisable
@@ -630,7 +633,24 @@ private[mockito] trait MockitoEnhancer extends MockCreator {
630
633
def withObjectMocked [O <: AnyRef : ClassTag ](block : => Any )(implicit defaultAnswer : DefaultAnswer , $pt : Prettifier ): Unit = {
631
634
val objectClass = clazz[O ]
632
635
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
+
634
654
val realImpl : O = moduleField.get(null ).asInstanceOf [O ]
635
655
636
656
val threadAwareMock = createMock(
0 commit comments