【问题标题】:Mocking Scala Trait using Scala, ScalaTest, and Mocktio使用 Scala、ScalaTest 和 Mockito 模拟 Scala Trait
【发布时间】:2014-07-25 20:34:40
【问题描述】:

无论出于何种原因,Mocktio 都不会模拟我在 trait 中拥有的方法,它会调用实际的方法。这是我的测试:

"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。任何帮助,将不胜感激。

我忘了说,Authorized 是一个动作组合,下面是它的使用方式:

  def index = Authorized {
    Ok(html.Stations.index(Stations.retrieveAllStations))
  } 

【问题讨论】:

  • 您的TestController 是如何实现其AuthMethods 的?显示该代码可能有助于我们分析。
  • @DonRoby 我添加了它是如何使用授权对象的。

标签: scala mockito scalatest


【解决方案1】:

您已经创建了一个模拟实现mockAuth,但尚未对其进行任何操作。创建一个模拟实现不会神奇地导致它替换一些其他对象。看起来您想创建 Authorized 对象的模拟并安排您的 TestController 使用它。您可能必须在某处打破依赖关系。

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

【讨论】:

  • 我更新了我的问题以包括使用授权的位置。这个答案是否仍然适用于这个问题?
  • 我用一个有用的(我希望的)指针更新了我的答案,指向似乎与您的情况相匹配的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 2016-12-25
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多