Я пытаюсь смоделировать вызов метода, который принимает аргумент call-by-name:
import org.scalatest.WordSpec
import org.scalatest.mock.MockitoSugar
import org.mockito.Mockito._
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
trait Collaborator {
def doSomething(t: => Thing)
}
trait Thing
@RunWith(classOf[JUnitRunner])
class Test extends WordSpec with MockitoSugar {
"The subject under test" should {
"call the collaborator" in {
// setup
val m = mock[Collaborator]
val t = mock[Thing]
// test code: this would actually be invoked by the SUT
m.doSomething(t)
// verify the call
verify(m).doSomething(t)
}
}
}
Меня в первую очередь интересует Mockito, так как это то, что я использую, но я быинтересно узнать, способен ли какой-либо из основных фальшивых фреймворков на такого рода тестирование.Тест не выполняется во время выполнения в строке verify
, с ошибкой типа
Argument(s) are different! Wanted:
collaborator.doSomething(
($anonfun$apply$3) <function>
);
-> at Test$$anonfun$1$$anonfun$apply$1.apply(Test.scala:27)
Actual invocation has different arguments:
collaborator.doSomething(
($anonfun$apply$2) <function>
);
-> at Test$$anonfun$1$$anonfun$apply$1.apply(Test.scala:24)
Если я правильно понимаю ситуацию, компилятор неявно переносит t
внулевая функция, которая возвращает t
.Затем фиктивная среда сравнивает эту функцию с той, которая создается в тестовом коде, что эквивалентно, но не equals()
.
Мой случай - относительно простая версия проблемы, но я думаю, что это будетпроблема с любой функцией высшего порядка.