Я пытаюсь высмеять вызов метода, который принимает аргумент по вызову:
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()
.
Мой случай - относительно простая версия проблемы, но я думаю, что это будет проблемой с любой функцией более высокого порядка.