Sto cercando di prendere in giro una chiamata di metodo che accetta una chiamata per nome argomento:Come schernire un metodo con argomenti funzionali in 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)
}
}
}
Sono principalmente interessato a Mockito dato che è quello che sto usando, ma sarei interessato a vedere se uno dei principali quadri di simulazione è capace di questo tipo di test. Il test fallisce in fase di esecuzione sulla linea verify
, con un errore come
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)
Se ho la comprensione della situazione in modo corretto, il compilatore è implicitamente avvolgendo t
in una funzione che restituisce nullaria t
. Il framework fittizio sta quindi confrontando quella funzione con quella prodotta nel codice di test, che è equivalente ma non è equals()
.
Il mio caso è una versione relativamente semplice del problema, ma credo che questo sarebbe un problema con qualsiasi funzione di ordine superiore.
Non capisco come questo si riferisce al iPad di Apple. –
Puoi descrivere come non funziona in modo più chiaro o includere un codice di prova. È difficile sapere cosa sta succedendo qui solo con la verifica mostrata. –
Ho reso l'esempio eseguibile come scritto e incluso l'output effettivo associato all'errore. –