如何在 Scala 中模拟对象 [英] How to mock an Object in Scala

查看:54
本文介绍了如何在 Scala 中模拟对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm new with scala. I'm trying to UT method inside my object Category, using Specs2 for UT and Mockito for mock. Why should I mock this? because this method take some data from mongo. There is my example

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

我尝试以这种方式模拟对象:

I've tried to mock object this way:

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)

感谢您的建议

推荐答案

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

Try to move all behavior, that you need to test into class or trait level. You'll be able to mixin different implementation in production code and test code.

例如:

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


}

这篇关于如何在 Scala 中模拟对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆