使用Scala,ScalaTest和Mockito模拟Scala Trait

时间:2014-07-25 20:34:41

标签: scala mockito scalatest

无论出于什么原因,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))
  } 

1 个答案:

答案 0 :(得分:1)

您已经创建了一个模拟实现mockAuth但是没有对它做任何事情。创建一个模拟实现不会神奇地导致它替换其他一些对象。看起来您想要创建Authorized对象的模拟并安排您的TestController使用它。你可能不得不在某个地方打破依赖。

(已更新)由于这是在Play框架的上下文中,您可能会发现this blog post有帮助。它描述了与您类似的情况。您似乎必须更改引用Authorized对象的方式才能提供模拟实现。