如何模拟尾递归函数?

H S*_*har 0 scala mocking mockito powermock scalamock

我想测试我的代码,它具有一些尾部递归函数。我无法嘲笑尾部递归函数,因为它们需要声明Finalor Private。大多数模拟框架不支持模拟此类方法,而那些支持的方法则无法按预期工作。

这有可能吗?有人可以给我他们的想法来模拟尾部递归函数吗?

我尝试使用MockitoFramework版本进行模拟3.0.0。我的测试套件具有该Mockito-Sugar特性。

尽管Mockito 文档建议可以模拟最终方法,但对我而言却是失败的。

我尝试使用scala-mock。我遇到了其他问题,但没有解决。

Tim*_*Tim 5

解决此问题的一种方法是将递归代码包装在外部函数中。例如:

def factorial(n: Int): Int = {
  @annotation.tailrec
  def loop(i: Int, res: Int): Int =
    if (i <= 1) {
      res
    } else {
      loop(i-1, i*res)
    }

  loop(n-1, n)
}
Run Code Online (Sandbox Code Playgroud)

使用这种模式的factorial方法并不需要是finalprivate,因此它可以被覆盖测试。

这种模式的另一个优点是,res不必在主功能界面中公开累加器值。这种模式还允许特殊情况在主递归代码之外进行处理,从而使内部代码更简单并且可能更快。