【问题标题】:How to mock an Object in Scala如何在 Scala 中模拟对象
【发布时间】:2015-08-06 07:39:56
【问题描述】:

我是 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$1$$anonfun$apply$1.apply(CategoryMockSpec.scala:18)
    at CategoryMockSpec$$anonfun$1$$anonfun$apply$1.apply(CategoryMockSpec.scala:16)

感谢您的建议

【问题讨论】:

  • 只要让对象实现一个trait,然后使用依赖注入而不是直接引用对象。
  • 能否做一些代码示例以便清楚理解?
  • 我做了这样的事情 object Category extends MongoBase[Category]("categories") with MyCategory class MyNewCategory { val service: MyCategory = Category } trait MyCategory { def test = 42 } 并进行了测试:val mockCategory = mock[MyCategory] val category = new MyNewCategory { override val service = mockCategory } category.service.test returns 222 category.service.test must beEqualTo(42) 这是另一个失败的测试原因类别试图与 mongo 连接

标签: scala unit-testing mockito specs2


【解决方案1】:

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

例如:

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...


}

【讨论】:

    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2019-12-24
    相关资源
    最近更新 更多