Skip to content

Commit 35beeb7

Browse files
authored
Decrease usage of deprecated elements (#572)
1 parent 3c4beb0 commit 35beeb7

File tree

25 files changed

+99
-133
lines changed

25 files changed

+99
-133
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ The library has independent developers, release cycle and versioning from core m
4141
If you're in Scala 2.12 you'll probably want to add the compiler flag `-Ypartial-unification`, if you don't you risk some compile errors when trying to stub complex types using the idiomatic syntax
4242

4343
## Notes for 2.0.0
44-
We dropped support for Scala 2.11 and Java 8, as Mockito 5 dropped support for Java 8.
44+
We dropped support for Scala 2.11 and Java 8, as Mockito 5 dropped support for Java 8.
45+
Java 11 is now the minimum supported version.
4546

4647
## Notes for 1.13.6
4748

build.sbt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import scala.io.Source
21
import scala.language.postfixOps
3-
import sbt.io.Using
42

53
val currentScalaVersion = "2.13.16"
64

@@ -21,7 +19,7 @@ lazy val commonSettings =
2119
scalacOptions ++= Seq(
2220
"-unchecked",
2321
"-feature",
24-
"-deprecation:false",
22+
"-deprecation",
2523
"-encoding",
2624
"UTF-8",
2725
"-Xfatal-warnings",
@@ -48,7 +46,8 @@ lazy val commonSettings =
4846
case _ =>
4947
Seq("org.scala-lang.modules" %% "scala-parallel-collections" % "1.2.0")
5048
}
51-
}
49+
},
50+
libraryDependencies += "org.scala-lang.modules" %% "scala-collection-compat" % "2.13.0"
5251
)
5352

5453
lazy val publishSettings = Seq(
@@ -154,8 +153,6 @@ lazy val core = (project in file("core"))
154153
name := "mockito-scala",
155154
libraryDependencies ++= Dependencies.commonLibraries,
156155
libraryDependencies ++= Dependencies.scalaReflection.value,
157-
// TODO remove when we remove the deprecated classes in org.mockito.integrations.Dependencies.scalatest
158-
libraryDependencies += Dependencies.scalatest % "provided",
159156
// include the macro classes and resources in the main jar
160157
Compile / packageBin / mappings ++= (macroSub / Compile / packageBin / mappings).value,
161158
// include the macro sources in the main source jar

cats/src/test/scala/org/mockito/cats/DoSomethingCatsTest.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class DoSomethingCatsTest
5050
ValueClass("mocked!") willBe returnedFG by aMock.returnsFutureEither("hello")
5151
Error("boom") willBe raisedG by aMock.returnsFutureEither("bye")
5252

53-
whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!"))
53+
whenReady(aMock.returnsFutureEither("hello"))(_.value shouldBe ValueClass("mocked!"))
5454
whenReady(aMock.returnsFutureEither("bye"))(_.left.value shouldBe Error("boom"))
5555
}
5656

@@ -68,7 +68,7 @@ class DoSomethingCatsTest
6868
ValueClass("mocked!") willBe returnedF by aMock.returnsMT[ErrorOr, ValueClass](ValueClass("hi"))
6969
Error("error") willBe raised by aMock.returnsMT[ErrorOr, ValueClass](ValueClass("bye"))
7070

71-
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("hi")).right.value shouldBe ValueClass("mocked!")
71+
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("hi")).value shouldBe ValueClass("mocked!")
7272
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("bye")).left.value shouldBe Error("error")
7373
}
7474

@@ -89,7 +89,7 @@ class DoSomethingCatsTest
8989
ValueClass("mocked!") willBe returnedF by aMock.returnsEitherT("hello")
9090

9191
whenReady(aMock.returnsEitherT("bye").value)(_.left.value shouldBe Error("error"))
92-
whenReady(aMock.returnsEitherT("hello").value)(_.right.value shouldBe ValueClass("mocked!"))
92+
whenReady(aMock.returnsEitherT("hello").value)(_.value shouldBe ValueClass("mocked!"))
9393
}
9494

9595
"work with OptionT" in {
@@ -125,9 +125,9 @@ class DoSomethingCatsTest
125125
.returnsFutureEither("hola")
126126
((i: Int, b: Boolean) => s"$i, $b") willBe answeredFG by aMock.returnsFutureOptionFrom(42, true)
127127

128-
whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!"))
129-
whenReady(aMock.returnsFutureEither("hi"))(_.right.value shouldBe ValueClass("hi mocked!"))
130-
whenReady(aMock.returnsFutureEither("hola"))(_.right.value shouldBe ValueClass("hola invocation mocked!"))
128+
whenReady(aMock.returnsFutureEither("hello"))(_.value shouldBe ValueClass("mocked!"))
129+
whenReady(aMock.returnsFutureEither("hi"))(_.value shouldBe ValueClass("hi mocked!"))
130+
whenReady(aMock.returnsFutureEither("hola"))(_.value shouldBe ValueClass("hola invocation mocked!"))
131131
whenReady(aMock.returnsFutureOptionFrom(42, true))(_.value shouldBe "42, true")
132132
}
133133
}

cats/src/test/scala/org/mockito/cats/IdiomaticMockitoCatsTest.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class IdiomaticMockitoCatsTest
5252
aMock.returnsFutureEither("hello") returnsFG ValueClass("mocked!")
5353
aMock.returnsFutureEither("bye") raisesG Error("boom")
5454

55-
whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!"))
55+
whenReady(aMock.returnsFutureEither("hello"))(_.value shouldBe ValueClass("mocked!"))
5656
whenReady(aMock.returnsFutureEither("bye"))(_.left.value shouldBe Error("boom"))
5757
}
5858

@@ -76,7 +76,7 @@ class IdiomaticMockitoCatsTest
7676
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("hi")) returnsF ValueClass("mocked!")
7777
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("bye")) raises Error("error")
7878

79-
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("hi")).right.value shouldBe ValueClass("mocked!")
79+
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("hi")).value shouldBe ValueClass("mocked!")
8080
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("bye")).left.value shouldBe Error("error")
8181
}
8282

@@ -125,7 +125,7 @@ class IdiomaticMockitoCatsTest
125125
aMock.returnsEitherT("hello") returnsF ValueClass("mocked!")
126126

127127
whenReady(aMock.returnsEitherT("bye").value)(_.left.value shouldBe Error("error"))
128-
whenReady(aMock.returnsEitherT("hello").value)(_.right.value shouldBe ValueClass("mocked!"))
128+
whenReady(aMock.returnsEitherT("hello").value)(_.value shouldBe ValueClass("mocked!"))
129129
}
130130

131131
"work with OptionT" in {
@@ -160,9 +160,9 @@ class IdiomaticMockitoCatsTest
160160
aMock.returnsFutureEither("hola") answersFG ((i: InvocationOnMock) => ValueClass(i.arg[String](0) + " invocation mocked!"))
161161
aMock.returnsFutureOptionFrom(42, true) answersFG ((i: Int, b: Boolean) => s"$i, $b")
162162

163-
whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!"))
164-
whenReady(aMock.returnsFutureEither("hi"))(_.right.value shouldBe ValueClass("hi mocked!"))
165-
whenReady(aMock.returnsFutureEither("hola"))(_.right.value shouldBe ValueClass("hola invocation mocked!"))
163+
whenReady(aMock.returnsFutureEither("hello"))(_.value shouldBe ValueClass("mocked!"))
164+
whenReady(aMock.returnsFutureEither("hi"))(_.value shouldBe ValueClass("hi mocked!"))
165+
whenReady(aMock.returnsFutureEither("hola"))(_.value shouldBe ValueClass("hola invocation mocked!"))
166166
whenReady(aMock.returnsFutureOptionFrom(42, true))(_.value shouldBe "42, true")
167167
}
168168
}

cats/src/test/scala/org/mockito/cats/MockitoCatsTest.scala

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class MockitoCatsTest extends AnyWordSpec with Matchers with MockitoSugar with A
4545
whenFG(aMock.returnsFutureEither("hello")) thenReturn ValueClass("mocked!")
4646
whenFG(aMock.returnsFutureEither("bye")) thenFailWith Error("boom")
4747

48-
whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!"))
48+
whenReady(aMock.returnsFutureEither("hello"))(_.value shouldBe ValueClass("mocked!"))
4949
whenReady(aMock.returnsFutureEither("bye"))(_.left.value shouldBe Error("boom"))
5050
}
5151

@@ -69,7 +69,7 @@ class MockitoCatsTest extends AnyWordSpec with Matchers with MockitoSugar with A
6969
whenF(aMock.returnsMT[ErrorOr, ValueClass](ValueClass("hi"))) thenReturn ValueClass("mocked!")
7070
whenF(aMock.returnsMT[ErrorOr, ValueClass](ValueClass("bye"))) thenFailWith Error("error")
7171

72-
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("hi")).right.value shouldBe ValueClass("mocked!")
72+
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("hi")).value shouldBe ValueClass("mocked!")
7373
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("bye")).left.value shouldBe Error("error")
7474
}
7575

@@ -103,7 +103,7 @@ class MockitoCatsTest extends AnyWordSpec with Matchers with MockitoSugar with A
103103
whenF(aMock.returnsEitherT("hello")) thenReturn ValueClass("mocked!")
104104

105105
whenReady(aMock.returnsEitherT("bye").value)(_.left.value shouldBe Error("error"))
106-
whenReady(aMock.returnsEitherT("hello").value)(_.right.value shouldBe ValueClass("mocked!"))
106+
whenReady(aMock.returnsEitherT("hello").value)(_.value shouldBe ValueClass("mocked!"))
107107
}
108108

109109
"work with OptionT" in {
@@ -138,9 +138,9 @@ class MockitoCatsTest extends AnyWordSpec with Matchers with MockitoSugar with A
138138
whenFG(aMock.returnsFutureEither("hola")) thenAnswer ((i: InvocationOnMock) => ValueClass(i.arg[String](0) + " invocation mocked!"))
139139
whenFG(aMock.returnsFutureOptionFrom(42, true)) thenAnswer ((i: Int, b: Boolean) => s"$i, $b")
140140

141-
whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!"))
142-
whenReady(aMock.returnsFutureEither("hi"))(_.right.value shouldBe ValueClass("hi mocked!"))
143-
whenReady(aMock.returnsFutureEither("hola"))(_.right.value shouldBe ValueClass("hola invocation mocked!"))
141+
whenReady(aMock.returnsFutureEither("hello"))(_.value shouldBe ValueClass("mocked!"))
142+
whenReady(aMock.returnsFutureEither("hi"))(_.value shouldBe ValueClass("hi mocked!"))
143+
whenReady(aMock.returnsFutureEither("hola"))(_.value shouldBe ValueClass("hola invocation mocked!"))
144144
whenReady(aMock.returnsFutureOptionFrom(42, true))(_.value shouldBe "42, true")
145145
}
146146
}
@@ -176,7 +176,7 @@ class MockitoCatsTest extends AnyWordSpec with Matchers with MockitoSugar with A
176176
doReturnFG[Future, ErrorOr, ValueClass](ValueClass("mocked!")).when(aMock).returnsFutureEither("hello")
177177
doFailWithG[Future, ErrorOr, Error, ValueClass](Error("boom")).when(aMock).returnsFutureEither("bye")
178178

179-
whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!"))
179+
whenReady(aMock.returnsFutureEither("hello"))(_.value shouldBe ValueClass("mocked!"))
180180
whenReady(aMock.returnsFutureEither("bye"))(_.left.value shouldBe Error("boom"))
181181
}
182182

@@ -194,7 +194,7 @@ class MockitoCatsTest extends AnyWordSpec with Matchers with MockitoSugar with A
194194
doReturnF[ErrorOr, ValueClass](ValueClass("mocked!")).when(aMock).returnsMT(ValueClass("hi"))
195195
doFailWith[ErrorOr, Error, ValueClass](Error("error")).when(aMock).returnsMT(ValueClass("bye"))
196196

197-
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("hi")).right.value shouldBe ValueClass("mocked!")
197+
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("hi")).value shouldBe ValueClass("mocked!")
198198
aMock.returnsMT[ErrorOr, ValueClass](ValueClass("bye")).left.value shouldBe Error("error")
199199
}
200200

@@ -216,7 +216,7 @@ class MockitoCatsTest extends AnyWordSpec with Matchers with MockitoSugar with A
216216
doReturnF[F, ValueClass](ValueClass("mocked!")).when(aMock).returnsEitherT("hello")
217217

218218
whenReady(aMock.returnsEitherT("bye").value)(_.left.value shouldBe Error("error"))
219-
whenReady(aMock.returnsEitherT("hello").value)(_.right.value shouldBe ValueClass("mocked!"))
219+
whenReady(aMock.returnsEitherT("hello").value)(_.value shouldBe ValueClass("mocked!"))
220220
}
221221

222222
"work with OptionT" in {
@@ -256,9 +256,9 @@ class MockitoCatsTest extends AnyWordSpec with Matchers with MockitoSugar with A
256256
.returnsFutureEither("hola")
257257
doAnswerFG[Future, Option, Int, Boolean, String]((i: Int, b: Boolean) => s"$i, $b").when(aMock).returnsFutureOptionFrom(42, true)
258258

259-
whenReady(aMock.returnsFutureEither("hello"))(_.right.value shouldBe ValueClass("mocked!"))
260-
whenReady(aMock.returnsFutureEither("hi"))(_.right.value shouldBe ValueClass("hi mocked!"))
261-
whenReady(aMock.returnsFutureEither("hola"))(_.right.value shouldBe ValueClass("hola invocation mocked!"))
259+
whenReady(aMock.returnsFutureEither("hello"))(_.value shouldBe ValueClass("mocked!"))
260+
whenReady(aMock.returnsFutureEither("hi"))(_.value shouldBe ValueClass("hi mocked!"))
261+
whenReady(aMock.returnsFutureEither("hola"))(_.value shouldBe ValueClass("hola invocation mocked!"))
262262
whenReady(aMock.returnsFutureOptionFrom(42, true))(_.value shouldBe "42, true")
263263
}
264264
}

cats/src/test/scala/org/mockito/cats/instances/ArgumentMatcherInstancesTest.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class ArgumentMatcherInstancesTest extends AnyFunSuiteLike with FunSuiteDiscipli
8080
test("EqTo works with cats syntax") {
8181
val aMock = mock[Foo]
8282

83-
val matcher = (EqTo("foo"), EqTo(new Integer(42))).tupled
83+
val matcher = (EqTo("foo"), EqTo(Integer.valueOf(42))).tupled
8484
aMock.takesTuple(argThat(matcher)) returns "mocked!"
8585

8686
aMock.takesTuple("foo", 42) shouldBe "mocked!"

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ import org.mockito.internal.util.reflection.LenientCopyTool
2424
import org.mockito.internal.{ ValueClassExtractor, ValueClassWrapper }
2525
import org.mockito.invocation.{ Invocation, InvocationContainer, InvocationOnMock, MockHandler }
2626
import org.mockito.mock.MockCreationSettings
27+
import org.mockito.quality.Strictness
2728
import org.mockito.stubbing._
2829
import org.mockito.verification.{ VerificationAfterDelay, VerificationMode, VerificationWithTimeout }
2930
import org.scalactic.{ Equality, Prettifier }
30-
import scala.collection.JavaConverters._
31+
32+
import scala.jdk.CollectionConverters._
3133
import scala.reflect.ClassTag
3234
import scala.reflect.runtime.universe.WeakTypeTag
3335

@@ -543,7 +545,7 @@ private[mockito] trait MockitoEnhancer extends MockCreator {
543545

544546
def spy[T <: AnyRef: ClassTag: WeakTypeTag](realObj: T, lenient: Boolean = false)(implicit $pt: Prettifier): T = {
545547
def mockSettings: MockSettings = Mockito.withSettings().defaultAnswer(CALLS_REAL_METHODS).spiedInstance(realObj)
546-
val settings = if (lenient) mockSettings.lenient() else mockSettings
548+
val settings = if (lenient) mockSettings.strictness(Strictness.LENIENT) else mockSettings
547549
mock[T](settings)
548550
}
549551

@@ -584,7 +586,7 @@ private[mockito] trait MockitoEnhancer extends MockCreator {
584586
ignoreDefaultArguments(m)
585587
Mockito.verifyNoMoreInteractions(m)
586588
case t: Array[AnyRef] =>
587-
verifyNoMoreInteractions(t: _*)
589+
verifyNoMoreInteractions(t.toIndexedSeq: _*)
588590
case _ =>
589591
throw notAMockPassedToVerifyNoMoreInteractions
590592
}
@@ -645,7 +647,7 @@ object LeniencySettings {
645647
}
646648

647649
val lenientStubs: LeniencySettings = new LeniencySettings {
648-
override def apply(settings: MockSettings): MockSettings = settings.lenient()
650+
override def apply(settings: MockSettings): MockSettings = settings.strictness(Strictness.LENIENT)
649651
}
650652
}
651653

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

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,13 @@ 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 }
12+
import scala.util.{ Try => uTry }
1313
import scala.util.control.NonFatal
1414

1515
object ReflectionUtils {
1616
import scala.reflect.runtime.{ universe => ru }
1717
import ru._
1818

19-
private val JavaVersion: Int =
20-
System.getProperty("java.version").split("\\.") match {
21-
case Array("1", v, _*) => v.toInt // Java 8 style: 1.8.x
22-
case Array(v, _*) => v.toInt // Java 9+ style: 11.x, 17.x, etc.
23-
}
24-
2519
implicit def symbolToMethodSymbol(sym: Symbol): Symbols#MethodSymbol = sym.asInstanceOf[Symbols#MethodSymbol]
2620

2721
private val mirror = runtimeMirror(getClass.getClassLoader)
@@ -120,39 +114,6 @@ object ReflectionUtils {
120114
}
121115

122116
def setFinalStatic(field: Field, newValue: AnyRef): Unit =
123-
if (JavaVersion < 17)
124-
setFinalStatic17Minus(field, newValue)
125-
else
126-
setFinalStatic17Plus(field, newValue)
127-
128-
private def setFinalStatic17Minus(field: Field, newValue: AnyRef): Unit = {
129-
val clazz = classOf[java.lang.Class[_]]
130-
field.setAccessible(true)
131-
val modifiersField: Field = uTry(clazz.getDeclaredField("modifiers")) match {
132-
case Success(modifiers) => modifiers
133-
case Failure(e) =>
134-
uTry {
135-
val getDeclaredFields0 = clazz.getDeclaredMethod("getDeclaredFields0", classOf[Boolean])
136-
val accessibleBeforeSet: Boolean = getDeclaredFields0.isAccessible
137-
getDeclaredFields0.setAccessible(true)
138-
val declaredFields: Array[Field] = getDeclaredFields0
139-
.invoke(classOf[Field], java.lang.Boolean.FALSE)
140-
.asInstanceOf[Array[Field]]
141-
getDeclaredFields0.setAccessible(accessibleBeforeSet)
142-
declaredFields.find("modifiers" == _.getName).get
143-
} match {
144-
case Success(modifiers) => modifiers
145-
case Failure(ex) =>
146-
e.addSuppressed(ex)
147-
throw e
148-
}
149-
}
150-
modifiersField.setAccessible(true)
151-
modifiersField.setInt(field, field.getModifiers & ~Modifier.FINAL)
152-
field.set(null, newValue)
153-
}
154-
155-
private def setFinalStatic17Plus(field: Field, newValue: AnyRef): Unit =
156117
try {
157118
// Try to get Unsafe instance (works with both sun.misc.Unsafe and jdk.internal.misc.Unsafe)
158119
val unsafeClass: Class[_] =
@@ -171,6 +132,9 @@ object ReflectionUtils {
171132
val staticFieldOffsetMethod = unsafeClass.getMethod("staticFieldOffset", classOf[Field])
172133
val putObjectMethod = unsafeClass.getMethod("putObject", classOf[Object], classOf[Long], classOf[Object])
173134

135+
// Make the field accessible
136+
field.setAccessible(true)
137+
174138
// Get base and offset for the field
175139
val base: Object = staticFieldBaseMethod.invoke(unsafe, field)
176140
val offset: Long = staticFieldOffsetMethod.invoke(unsafe, field).asInstanceOf[Long]

0 commit comments

Comments
 (0)