タイトルでほぼ言い尽くしてますが、いちおう条件改めて詳細に書くと
build.sbt
libraryDependencies += "org.mockito" % "mockito-core" % "2.28.2" scalaVersion := "2.12.8"
Main.scala
package example object Main { def main(args: Array[String]): Unit = { val x = org.mockito.Mockito.mock(classOf[java.sql.Connection]) println(x) } }
- sbtは1.2.8(他はまだ試してない)
- mockitoの最新(2.28.2)。なぜか2.23.0だと動く(なのでscalikejdbcはこのversionから上げてない)
- fork を trueにすると動く
- jdk11ではなくjdk8だと動く
- ひとまずscalikejdbcでかるく確認したのはjava.sql.Connectionなどだが、jdk9以降のmoduleの関係上、java.sql配下のやつ全部だと思う
- Scalaのversionはたぶん関係ない?(確認したのは2.12.8)
sbtで多少関連するかもしれないissue
- https://github.com/sbt/sbt/issues/1103 大昔のissue。forkしろでcloseされてる。mockitoが悪いという結論?
- https://github.com/sbt/sbt/issues/4328 java.sqlという点では似ているが、別issueか?
それで、誰が悪いのか?というのが難しい(なのでどこかにissueたてずにblog書いてる)わけだが
- mockito 2.23.0では動いていたのだから、mockitoが悪い?
- sbtでforkすると動くのだから、sbtでforkしない場合に動かないのはsbtのClassLoaderが悪い?
- 可能性低いと思ってるが、実はScala自体がjdk9以降のmoduleに完全対応してないのが悪い
sbt 1.3.0-RC2 (https://t.co/aqhjukX7w5) で直ると思います。今 AdoptOpenJDK JDK 11 でテストしましたが、Mock for Connection, hashCode: 413888838 と出ました。
— ∃ugene 🥙yokot∀ (@eed3si9n_ja) 2019年6月4日