Scala 是否可以模拟在另一个函数中定义的函数?

Scala 是否可以模拟在另一个函数中定义的函数?,scala,scalatest,scalamock,Scala,Scalatest,Scalamock,我有一些访问数据库的函数,为了进行测试,我需要模拟这些函数 为了便于使用,我想在另一个函数中定义这些函数,在这里我可以利用作用域来减少必须传递的参数数量 我需要测试父函数,同时模拟嵌套函数 模拟嵌套函数有什么技巧吗 第二个问题是,当嵌套在任意深度时,是否有方法模拟函数 还有一个旁注:我的项目很轻,我甚至没有像建议的那样使用经典的模仿;但对于这个问题,任何形式的嘲弄都可以 下面是一些非常简单的示例代码: class Storage { def storeData(specId: Long, d

我有一些访问数据库的函数,为了进行测试,我需要模拟这些函数

为了便于使用,我想在另一个函数中定义这些函数,在这里我可以利用作用域来减少必须传递的参数数量

我需要测试父函数,同时模拟嵌套函数

模拟嵌套函数有什么技巧吗

第二个问题是,当嵌套在任意深度时,是否有方法模拟函数

还有一个旁注:我的项目很轻,我甚至没有像建议的那样使用经典的模仿;但对于这个问题,任何形式的嘲弄都可以

下面是一些非常简单的示例代码:

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

这是不可能的,但您可以定义一个特性并在函数中实现它(如果您真的希望在函数中实现此逻辑):

您的模拟将是这样的:

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转换为成员而不是函数参数


无法对内部函数执行相同操作的原因是它们是私有的,并且不能对它们执行类型检查(与内部特征相比)。

我不知道,但您可以检查EasyMock,这可能会对您有所帮助。代码示例会很有用,但我非常确定这是不可能的。
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