Skip to content

Commit 61edc0a

Browse files
authored
#350 Fix Refelction utils for java 13+ (#356)
* getField for java 12+ * Fix for java 13+, avoid type conversion error * Fix the right method * undo allchanges * undo allchanges * remove unused import * sync upstream and apply changes Co-authored-by: Alberto Lago <[email protected]> [skip ci]
1 parent fd57003 commit 61edc0a

File tree

2 files changed

+23
-22
lines changed

2 files changed

+23
-22
lines changed

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

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,9 @@ 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
3231
import scala.collection.JavaConverters._
3332
import scala.reflect.ClassTag
3433
import scala.reflect.runtime.universe.WeakTypeTag
35-
import scala.util.{ Failure, Success, Try }
36-
import scala.util.control.Breaks.break
3734

3835
private[mockito] trait ScalacticSerialisableHack {
3936
//Hack until Equality can be made serialisable
@@ -633,24 +630,7 @@ private[mockito] trait MockitoEnhancer extends MockCreator {
633630
def withObjectMocked[O <: AnyRef: ClassTag](block: => Any)(implicit defaultAnswer: DefaultAnswer, $pt: Prettifier): Unit = {
634631
val objectClass = clazz[O]
635632
objectClass.synchronized {
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-
633+
val moduleField = objectClass.getDeclaredField("MODULE$")
654634
val realImpl: O = moduleField.get(null).asInstanceOf[O]
655635

656636
val threadAwareMock = createMock(

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import ru.vyarus.java.generics.resolver.GenericsResolver
99

1010
import scala.reflect.ClassTag
1111
import scala.reflect.internal.Symbols
12+
import scala.util.{ Failure, Success, Try => uTry }
1213
import scala.util.control.NonFatal
1314

1415
object ReflectionUtils {
@@ -124,10 +125,30 @@ object ReflectionUtils {
124125
}
125126

126127
def setFinalStatic(field: Field, newValue: Any): Unit = {
128+
val clazz = classOf[java.lang.Class[_]]
127129
field.setAccessible(true)
128-
val modifiersField = classOf[Field].getDeclaredField("modifiers")
130+
val modifiersField: Field = uTry(clazz.getDeclaredField("modifiers")) match {
131+
case Success(modifiers) => modifiers
132+
case Failure(e) =>
133+
uTry {
134+
val getDeclaredFields0 = clazz.getDeclaredMethod("getDeclaredFields0", classOf[Boolean])
135+
val accessibleBeforeSet: Boolean = getDeclaredFields0.isAccessible
136+
getDeclaredFields0.setAccessible(true)
137+
val declaredFields: Array[Field] = getDeclaredFields0
138+
.invoke(classOf[Field], java.lang.Boolean.FALSE)
139+
.asInstanceOf[Array[Field]]
140+
getDeclaredFields0.setAccessible(accessibleBeforeSet)
141+
declaredFields.find("modifiers" == _.getName).get
142+
} match {
143+
case Success(modifiers) => modifiers
144+
case Failure(ex) =>
145+
e.addSuppressed(ex)
146+
throw e
147+
}
148+
}
129149
modifiersField.setAccessible(true)
130150
modifiersField.setInt(field, field.getModifiers & ~Modifier.FINAL)
131151
field.set(null, newValue)
132152
}
153+
133154
}

0 commit comments

Comments
 (0)