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



我有一些访问数据库的函数,出于测试目的,我需要对其进行模拟。

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

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

有什么技巧可以模拟嵌套的函数吗?

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

顺便说一句:我的项目很轻,我甚至没有使用经典的嘲讽,只是像这篇博客文章所暗示的那样可以堆叠的特征;但对于这个问题,任何嘲讽都是可以的。

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

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变成一个成员,而不是函数参数。

内部函数不可能这样做的原因是它们是私有的,并且不能对它们执行类型检查(与内部特性相比)。

相关内容

  • 没有找到相关文章

最新更新