如何在 Scala 中模拟对象

How to mock an Object in Scala

我是 Scala 新手。我正在尝试在我的对象类别中使用 UT 方法,使用 Specs2 进行 UT 和 Mockito 进行模拟。我为什么要嘲笑这个?因为此方法从 mongo 获取一些数据。 有我的例子

object Category extends MongoBase[Category]("categories") {
....
def myMethod(str: String): String
....
}

我试过用这种方式模拟对象:

val mockCategory = mock[Category.type]
mockCategory.myMethod("1") returns "2"

但是我的测试失败了

   Cannot mock/spy class 
Mockito cannot mock/spy following:
  - final classes
  - anonymous classes
  - primitive types
org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class
Mockito cannot mock/spy following:
  - final classes
  - anonymous classes
  - primitive types
    at CategoryMockSpec.mock(CategoryMockSpec.scala:14)
    at CategoryMockSpec$$anonfun$$anonfun$apply.apply(CategoryMockSpec.scala:18)
    at CategoryMockSpec$$anonfun$$anonfun$apply.apply(CategoryMockSpec.scala:16)

感谢任何建议

尝试将您需要测试的所有行为移动到 class 或特征级别。 您将能够在生产代码和测试代码中混合不同的实现。

例如:

trait CategoryApi {
  def importantMethod: Int 
}

class Category extends MongoBase[Category]("categories") with CategoryApi {
  override def importantMethod = { /*go to mongo for real data*/ }
}

class CategoryTest with CategoryApi {
  override def importantMethod = 42
}

// service which uses categories

class SomeService(catApi: CategoryApi) {
  def methodToTest = {
    importantMethod
  }
}

// your test

test() {

val service = new SomeService(CategoryTest())
service.methodToTest == 42 // return 42...


}