无论出于什么原因,Mocktio都不会模仿我在特征中的方法,它会调用实际的方法。这是我的测试:
"displays the index page" in {
val mockAuth = mock[AuthMethods]
when(mockAuth.isAllowed(-1, "", "")).thenReturn(true)
val controller = new TestController()
val result = controller.index().apply(FakeRequest())
val bodyText = contentAsString(result)
bodyText must include ("Name")
}
这是特征和对象:
trait AuthMethods {
def isAllowed(userID:Long, method:String, controller:String) : Boolean = {
//do stuff..
}
object Authorized extends AuthMethods with ActionBuilder [Request] {
def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = {
if(isAllowed(userID, method, controller) {
//do some more stuff..
}
为什么它调用实际方法与模拟方法有关?我正在使用Scala 2.10.4。任何帮助,将不胜感激。
我忘了提及,授权是一个动作组合,以下是它的使用方式:
def index = Authorized {
Ok(html.Stations.index(Stations.retrieveAllStations))
}
答案 0 :(得分:1)
您已经创建了一个模拟实现mockAuth
但是没有对它做任何事情。创建一个模拟实现不会神奇地导致它替换其他一些对象。看起来您想要创建Authorized
对象的模拟并安排您的TestController使用它。你可能不得不在某个地方打破依赖。
(已更新)由于这是在Play框架的上下文中,您可能会发现this blog post有帮助。它描述了与您类似的情况。您似乎必须更改引用Authorized
对象的方式才能提供模拟实现。