Estoy tratando de burlarse de una llamada a un método que toma un argumento de llamada por nombre:Cómo simular un método con argumentos funcionales en Scala?
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)
}
}
}
estoy interesado principalmente en Mockito ya que eso es lo que estoy usando, pero me gustaría que se pusiera ver si alguno de los principales frameworks simulados es capaz de realizar este tipo de pruebas. La prueba falla en tiempo de ejecución en la línea verify
, con un error como
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)
Si estoy entendiendo correctamente la situación, el compilador está implícitamente terminando t
en una función que devuelve nularia t
. El marco simulado está comparando esa función con la que se produce en el código de prueba, que es equivalente pero no equals()
.
Mi caso es una versión relativamente simple del problema, pero creo que esto sería un problema con cualquier función de orden superior.
No entiendo cómo esto se relaciona con el iPad de Apple. –
¿Podría describir cómo no funciona más claramente o incluir algún código de prueba? Es difícil saber qué está pasando aquí solo con la verificación que se muestra. –
Hice el ejemplo ejecutable tal como está escrito e incluí la salida real asociada con la falla. –