如何在 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...
}
我是 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...
}