2014-11-03 118 views
0

我有一些函数可以访问数据库,为了测试目的我需要模拟这些数据库。是否可以模拟在另一个函数中定义的函数?

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

我需要测试父函数,同时嘲笑嵌套函数。

是否有任何技巧来模拟嵌套的函数?

作为第二个问题,有什么方法可以在任意深度嵌套时模拟函数?

还有一个方面说明:我的项目足够轻松我甚至没有使用古典嘲笑,只是stackable traitsthis blog post建议;但对于这个问题,任何一种嘲讽都没有问题。

下面是一些很简单的例子代码:

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

我不知道,但你可以检查EasyMock,可能会帮助你 – 2014-11-03 17:12:32

+0

代码示例将是有用的,但我敢肯定,这是不可能的。 – Nate 2014-11-03 17:21:41

回答

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 

您可能会在也可以将storedDefault转换为成员而不是函数参数。

为什么不可能对内部函数做同样的事情是因为它们是私有的,而且不能对它们进行类型检查(与内部特征相比)。

相关问题