0

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

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

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

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

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

附带说明:我的项目足够轻,我什至没有使用经典的模拟,只是像这篇博文所建议的那样可堆叠的特征;但是对于这个问题,任何形式的嘲讽都可以。

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

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

1 回答 1

0

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

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

您也可以将 storageDefault 转换为成员而不是函数参数。

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

于 2014-11-03T18:11:39.160 回答