Scalamock“注释”库

时间:2013-10-16 13:02:29

标签: unit-testing scala mocking sbt

我尝试在我的应用程序中使用Scalamock中的模拟,但我想要模拟的是带有参数的类。我看到scalamock doc,他们说要模拟类,我必须导入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

1 个答案:

答案 0 :(得分:1)

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

在我看来没关系,因为你不需要这个编译器插件来使用scala mock。要将scala模拟与 scala测试一起使用,您可以使用mock提供的org.scalamock.scalatest.MockFactory功能。请参阅下面的简单测试:

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")
    }
  }
}
相关问题