以下のように一旦structural type使ってreflection経由にする以外に思いついてないんですが、他の良い方法あります???
mockito以外のScala専用ライブラリなら対応してるものがあるかもしれないけど(詳細未調査)、素のmockitoだと、おそらくこうするしか・・・???
macroでstructural type自体を生成する、的な方法は取れる可能性はあるけど、結局structural typeになるはず・・・?
build.sbt
libraryDependencies ++= Seq( "org.mockito" % "mockito-core" % "5.20.0", ) scalaVersion := "3.7.3"
Main.scala
package example import org.mockito.ArgumentMatchers import org.mockito.Mockito trait Context trait Foo { def withContext[A](function: Context ?=> A): A } object Main { def main(args: Array[String]): Unit = { test1() test2() } // これはダメ def test1(): Unit = { val foo = Mockito.mock(classOf[Foo]) val context = Mockito.mock(classOf[Context]) Mockito.when(foo.withContext(ArgumentMatchers.any())).thenAnswer(_.getArguments.head.asInstanceOf[Context => Any].apply(context)) val res = foo.withContext{ "aaa" } println(s"test1 = ${res}") } // これで動く def test2(): Unit = { import scala.reflect.Selectable.reflectiveSelectable val foo = Mockito.mock(classOf[Foo]) val context = Mockito.mock(classOf[Context]) val foo2 = foo.asInstanceOf[{ def withContext(function: Context => Any): Any }] Mockito.when(foo2.withContext(ArgumentMatchers.any())).thenAnswer(_.getArguments.head.asInstanceOf[Context => Any].apply(context)) val res = foo.withContext{ "aaa" } println(s"test2 = ${res}") } }