如何在 Scala 中使用模拟来模拟单例对象
How to use mocks in Scala to mock a singleton object
我最近开始使用 Scala 编程。我有一个项目,该项目具有相互调用的 classes 层次结构。最终,他们最后一个调用单例 DAL(数据访问层)对象,该对象调用 MySQL.
中的存储过程
我有一个具有以下签名的 DAL 对象:
def callStoredProcedure(procName: String, params: Array[String]): Boolean
我想编写一个调用顶层函数的测试 class,并检查 procName
传递给该函数的内容。
如何为 DAL 对象创建模拟?我怎样才能将它注入流程管道,或者是否有一种 better/recommended 方法可以用一个模拟来替换单例,该模拟只是 returns 过程名称而不是调用它?
我们目前正在使用 Mockito,但我对任何事情都持开放态度。
不要直接使用单例,那不是一个好主意。你知道为什么?因为你不能模拟它们进行单元测试,呃。
改为将其作为 class 的参数:
trait DAL {
def callStoredProcedure(procName: String, params: Array[String]): Boolean
}
object DALImpl extends DAL {
def callStoredProcedure(procName: String, params: Array[String]): Boolean = doStuff
}
class Foo(dal: DAL = DALImpl)
val testMe = new Foo(mock[DAL])
或
class Foo {
def dal: DAL = DALImpl
}
val testMe = new Foo {
override def dal = mock[DAL]
}
你可以这样做:
class Foo(dal: DAL)
val testMe = new Foo(dal = mock[DAL.type])
干杯
我最近开始使用 Scala 编程。我有一个项目,该项目具有相互调用的 classes 层次结构。最终,他们最后一个调用单例 DAL(数据访问层)对象,该对象调用 MySQL.
中的存储过程我有一个具有以下签名的 DAL 对象:
def callStoredProcedure(procName: String, params: Array[String]): Boolean
我想编写一个调用顶层函数的测试 class,并检查 procName
传递给该函数的内容。
如何为 DAL 对象创建模拟?我怎样才能将它注入流程管道,或者是否有一种 better/recommended 方法可以用一个模拟来替换单例,该模拟只是 returns 过程名称而不是调用它?
我们目前正在使用 Mockito,但我对任何事情都持开放态度。
不要直接使用单例,那不是一个好主意。你知道为什么?因为你不能模拟它们进行单元测试,呃。 改为将其作为 class 的参数:
trait DAL {
def callStoredProcedure(procName: String, params: Array[String]): Boolean
}
object DALImpl extends DAL {
def callStoredProcedure(procName: String, params: Array[String]): Boolean = doStuff
}
class Foo(dal: DAL = DALImpl)
val testMe = new Foo(mock[DAL])
或
class Foo {
def dal: DAL = DALImpl
}
val testMe = new Foo {
override def dal = mock[DAL]
}
你可以这样做:
class Foo(dal: DAL)
val testMe = new Foo(dal = mock[DAL.type])
干杯