我有一些访问数据库的函数,出于测试目的,我需要对其进行模拟。
为了便于使用,我想在另一个函数中定义这些函数,在那里我可以利用作用域来减少必须传递的参数数量
我需要测试父函数,同时模拟嵌套函数。
有什么技巧可以模拟嵌套的函数吗?
第二个问题是,当函数嵌套在任意深度时,有没有方法模拟函数?
顺便说一句:我的项目很轻,我甚至没有使用经典的嘲讽,只是像这篇博客文章所暗示的那样可以堆叠的特征;但对于这个问题,任何嘲讽都是可以的。
下面是一些非常简单的示例代码:
class Storage {
def storeData(specId: Long, data: String): Unit = {
val rawPath = "/path/to/file"
def storeFsEntry: Unit = {
// do stuff
}
def storeDbEntry: Unit = {
// do stuff we need mocked
}
if ( specId == 1 )
{
storeDbEntry
storeFsEntry
}
}
}
这是不可能的,但您可以定义一个特性并在函数中实现它(如果您真的想在函数中实施这个逻辑):
class Storage {
trait Storing {
def path: String //you have to define all free members
def storeDbEntry: Unit
def storeFsEntry: Unit
}
def storeData(specId: Long, data: String, storingDefault: Option[Storing] = None): Unit = {
val myStoring = new Storing {
...implement it here
}
val storing = storingDefault getOrElse myStoring
import storing._
if ( specId == 1 ) {
storeDbEntry
storeFsEntry
}
}
}
你的模拟将是这样的:
trait StorageMock extends Storage {
override def storeData(specId: Long, data: String, storingDefault: Option[Storing] = None): Unit = {
val storingOverride = new Storing { ... } //mocking functionality
super.storeData(specId, data, storingDefault orElse Some(storingOverride))
}
}
new Storage with StorageMock
您也可以将storingDefault变成一个成员,而不是函数参数。
内部函数不可能这样做的原因是它们是私有的,并且不能对它们执行类型检查(与内部特性相比)。