我改變了你的//做些什麼?所以它會編譯,然後打印的代碼在語法分析器階段結束:
$scalac MyService.scala -Xprint:parser
[[syntax trees at end of parser]] // MyService.scala
package <empty> {
object MyService extends MyTrait {
def <init>() = {
super.<init>();
()
};
def myMethod[T](builder: T)(implicit evidence$1:_root_.scala.Function1[T,InvokableBuilder[MyClass]]): MyResponse = $qmark$qmark$qmark
}
}
正如你所看到的,myMethod的有第二個參數列表由於綁定您的視圖。 我不確定你會如何嘲笑Mockito,但我建議嘗試ScalaMock。
注意:視圖邊界不推薦 - 我建議用一個隱式參數替換它們(請參閱scalac解析器如何執行上述操作)。
稍長的例子:
import org.scalamock.scalatest.MockFactory
import org.scalatest.FlatSpec
import scala.language.implicitConversions
class FooTest extends FlatSpec with MockFactory {
trait MyTrait {
def myMethod[T](builder: T)(implicit ev$1: T => InvokableBuilder[MyClass]): MyResponse
}
trait InvokableBuilder[T]
class MyClass
class MyResponse
class Foo
object MyService extends MyTrait {
def myMethod[T](builder: T)(implicit ev$1: T => InvokableBuilder[MyClass]): MyResponse = {
//do something
???
}
}
behavior of "Foo"
it should "foo" in {
val x = mock[MyTrait]
implicit val fooConvert: Foo => InvokableBuilder[MyClass] = ???
(x.myMethod(_: Foo)).expects(*).once()
}
}
我同意這個答案的前半部分 - 斯卡拉'object's是單身,並應受到同樣的對待。 我不喜歡使用PowerMock解決這個問題,並在測試執行過程中操作字節碼的想法。在我看來,讓'object'實現一個'trait'就好像你已經擁有了,並且嘲笑這個特性。 –
對不起,我的回覆是一半寫入,然後輸入提交:) –
明白了...並將其添加到答案。我完全同意。 – GhostCat