【问题标题】:Scalamock "annotation" libraryScalamock“注释”库
【发布时间】:2015-12-09 15:13:48
【问题描述】:

我尝试在我的应用程序中使用 Scalamock 模拟,但我想模拟的是一个带有参数的类。我看到了 scalamock 文档,他们说要模拟类,我必须导入 org.scalamock.annotation.mock 才能使用某些功能。 My reference is scalatest docs.

“注解”好像不存在……

我的 sbt 依赖:

"org.scalamock" % "scalamock-scalatest-support_2.10" % "3.0.1" % "test"
"org.scalamock" % "scalamock-core_2.10" % "3.0.1"

我想我忘记了一个库,但我不知道它是什么..

编辑:

测试代码:

import org.scalatest.FlatSpec
import org.scalamock.scalatest.MockFactory

class AuthenticationServiceTest extends FlatSpec with MockFactory
{
    "A user" should " be authenticated" in
    {
      val user = mock[User]
      val tenant = mock[Tenant]
      inSequence {
        (authenticate(tenant, user) _).expects.returning(true)
      }

      assert(authenticate(tenant, user))
    }
}

类:

class User (
  val username    : String,
  var password    : String,
  var firstname   : String,
  var lastname    : String,
  var isActivated : Boolean,
  val tenantId    : TenantId
             )
{}

class Tenant (
  val tenantId    : TenantId,
  val companyName : String,
  var fullAddress : String,
  var email       : String,
  var phone       : String,
  var isActivated : Boolean
               )
{}

测试方法:

def authenticate(tenant: Tenant, user: User): Boolean = { 
//code... 
}

错误:

[error] Unspecified value parameters username, password, firstname, ...
[error]       val user = mock[User]
[error]                      ^
[error] one error found
[error] (test:compile) Compilation failed
[error] Total time: 9 s, completed 17 oct. 2013 09:16:18

【问题讨论】:

  • 考虑使用 double % 而不是使用 _2.10 后缀。 "org.scalamock" %% "scalamock-scalatest-support" % "3.0.1" % "test"

标签: unit-testing scala mocking sbt


【解决方案1】:

您可能阅读了生成的模拟部分,它依赖于 ScalaMock 编译器插件,而您没有依赖它。

在我看来是可以的,因为你不需要这个编译器插件来使用 scala mock。要将 scala mock 与 scala test 一起使用,您可以使用 org.scalamock.scalatest.MockFactory 提供的 mock 函数。请参阅下面的简单导入测试:

import org.scalatest.FreeSpec
import org.scalamock.scalatest.MockFactory

class MySpec extends FreeSpec with MockFactory {

  class C {
    def method: String = "ABC"
  }

  abstract class AC {
    def method: String
  }

  trait T {
    def method: String
  }

  trait M[A] {
    def method: A
  }

  "You don't need to create real objects, you can mock" - {
    "class" in {
      val m = mock[C]
      inSequence {
        (m.method _).expects.returning("X")
      }
      assert(m.method === "X")
    }
    "abstract class" in {
      val m = mock[AC]
      inSequence {
        (m.method _).expects.returning("X")
      }
      assert(m.method === "X")
    }
    "trait" in {
      val m = mock[T]
      inSequence {
        (m.method _).expects.returning("X")
      }
      assert(m.method === "X")
    }
    "trait parametrized by type" in {
      val m = mock[M[String]]
      inSequence {
        (m.method _).expects.returning("X")
      }
      assert(m.method === "X")
    }
  }
}

【讨论】:

  • 感谢您的回复!但是 IDE 和 SBT 无法解析 .expects 方法......而且我的模拟不起作用(我将编辑我的帖子)
  • 我的 IDE (Intellij) 也不知道 .expects 是什么。这是因为 scalamock 在底层使用 macros。在 SBT 中它编译没有问题。更清楚地说,我的 SBT 配置是:sbt.version=0.12.2scalacOptions ++= List("-feature", "-language:implicitConversions"), scalaVersion := "2.10.2", resolvers ++= List( "org.scalatest" % "scalatest_2.10.0" % "2.0.M5" % "test", ("org.scalamock" %% "scalamock-scalatest-support" % "3.0.1" exclude("org.scalatest", "scalatest_2.10")) % "test" )
  • 我的代码几乎相同,但 SBT 无法编译,并在我的主题中添加了一条消息错误..
猜你喜欢
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 2011-03-11
  • 2011-01-10
  • 1970-01-01
相关资源
最近更新 更多