Skip to content

Commit fd57003

Browse files
trompaAlberto Lago
and
Alberto Lago
authored
#350 get Modifiers for java 13+ (#354)
* getField for java 12+ * Fix for java 13+, avoid type conversion error Co-authored-by: Alberto Lago <alberto.lago@boxever.com>
1 parent 726d9ec commit fd57003

File tree

1 file changed

+21
-1
lines changed

1 file changed

+21
-1
lines changed

common/src/main/scala/org/mockito/MockitoAPI.scala

+21-1
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@ import org.mockito.stubbing._
2828
import org.mockito.verification.{ VerificationAfterDelay, VerificationMode, VerificationWithTimeout }
2929
import org.scalactic.{ Equality, Prettifier }
3030

31+
import java.lang.reflect.Field
3132
import scala.collection.JavaConverters._
3233
import scala.reflect.ClassTag
3334
import scala.reflect.runtime.universe.WeakTypeTag
35+
import scala.util.{ Failure, Success, Try }
36+
import scala.util.control.Breaks.break
3437

3538
private[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

Comments
 (0)