Ошибка указывает, что apply$mcV$sp()
не вызывается, поэтому давайте попробуем сравнить вывод -Xprint:jvm
в обоих случаях соответственно, чтобы увидеть, где он вызывается:
Дано
Future {
mockFunction()
println("test")
}
вывод -Xprint:jvm
равен
final <static> <artifact> def $anonfun$new$2(mockFunction$1: Function0): Unit = {
mockFunction$1.apply$mcV$sp();
scala.Predef.println("test")
};
final <static> <artifact> def $anonfun$new$1($this: FutureTest): Unit = {
val mockFunction: Function0 = $this.mock((ClassTag.apply(classOf[scala.Function0]): scala.reflect.ClassTag)).$asInstanceOf[Function0]();
scala.concurrent.Future.apply({
$anonfun(mockFunction)
}, scala.concurrent.ExecutionContext$Implicits.global());
org.mockito.Mockito.verify(mockFunction, org.mockito.Mockito.timeout(1000L)).$asInstanceOf[Function0]().apply$mcV$sp()
};
имея
Future {
mockFunction()
}
Выход -Xprint:jvm
равен
final <static> <artifact> def $anonfun$new$1($this: FutureTest): Unit = {
val mockFunction: Function0 = $this.mock((ClassTag.apply(classOf[scala.Function0]): scala.reflect.ClassTag)).$asInstanceOf[Function0]();
scala.concurrent.Future.apply(mockFunction, scala.concurrent.ExecutionContext$Implicits.global());
org.mockito.Mockito.verify(mockFunction, org.mockito.Mockito.timeout(1000L)).$asInstanceOf[Function0]().apply$mcV$sp()
};
Обратите внимание на разницу в том, как mockFunction
вызывается
Future.apply({$anonfun(mockFunction) ...
Future.apply(mockFunction ...
В первом случае он передается в качестве аргумента $anonfun
, который действительно вызывает apply$mcV$sp()
примерно так:
mockFunction$1.apply$mcV$sp();
во втором случае вызова apply$mcV$sp()
нигде не найти.
Использование Future.successful { mockFunction() }
, кажется, заставляет его работать, и мы видим, что apply$mcV$sp()
вызывается при необходимости
final <static> <artifact> def $anonfun$new$1($this: FutureTest): Unit = {
val mockFunction: Function0 = $this.mock((ClassTag.apply(classOf[scala.Function0]): scala.reflect.ClassTag)).$asInstanceOf[Function0]();
scala.concurrent.Future.successful({
mockFunction.apply$mcV$sp();
scala.runtime.BoxedUnit.UNIT
});
org.mockito.Mockito.verify(mockFunction, org.mockito.Mockito.timeout(1000L)).$asInstanceOf[Function0]().apply$mcV$sp()
};
Откуда вообще взялась apply$mcV$sp
? Экспертиза Function0
trait Function0[@specialized(Specializable.Primitives) +R] extends AnyRef { self =>
def apply(): R
override def toString() = "<function0>"
}
мы видим @specialized(Specializable.Primitives)
, что приводит к
abstract trait Function0 extends Object { self: example.Fun =>
def apply(): Object;
override def toString(): String = "<function0>";
<specialized> def apply$mcZ$sp(): Boolean = scala.Boolean.unbox(Fun.this.apply());
<specialized> def apply$mcB$sp(): Byte = scala.Byte.unbox(Fun.this.apply());
<specialized> def apply$mcC$sp(): Char = scala.Char.unbox(Fun.this.apply());
<specialized> def apply$mcD$sp(): Double = scala.Double.unbox(Fun.this.apply());
<specialized> def apply$mcF$sp(): Float = scala.Float.unbox(Fun.this.apply());
<specialized> def apply$mcI$sp(): Int = scala.Int.unbox(Fun.this.apply());
<specialized> def apply$mcJ$sp(): Long = scala.Long.unbox(Fun.this.apply());
<specialized> def apply$mcS$sp(): Short = scala.Short.unbox(Fun.this.apply());
<specialized> def apply$mcV$sp(): Unit = {
Function0.this.apply();
()
};
def /*Fun*/$init$(): Unit = {
()
}
};
где мы видим apply$mcV$sp
в свою очередь звонки фактические apply
<specialized> def apply$mcV$sp(): Unit = {
Function0.this.apply();
()
};
Кажется, это некоторые из частей проблемы, однако у меня нет достаточных знаний, чтобы собрать их вместе. На мой взгляд, Future(mockFunction())
должно работать просто отлично, поэтому нам нужен кто-то более знающий, чтобы объяснить это. А пока попробуйте Future.successful
в качестве обходного пути.