如何模拟尾部递归功能



我想测试具有一些尾部递归功能的代码。我无法模拟尾部递归功能,因为它们需要声明FinalPrivate。大多数模拟框架不支持模拟此类方法,而支持的方法则无法正常工作。

这根本可以吗?有人可以为我提供他们的想法来模拟尾部递归功能吗?

我尝试使用Mockito框架版本3.0.0嘲笑。我的测试套件是用Mockito-Sugar特质扩展的。

尽管Mockito文档表明可以模拟最终方法,但对我来说会失败。

我尝试使用scala-mock。我面临着不同的问题,没有解决。

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

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

使用此模式factorial方法不需要finalprivate,因此可以覆盖测试。

这种模式的另一个优点是累加器值res不必在主函数接口中公开。此模式还允许在主要递归代码之外处理特殊情况,从而使内部代码更加简单,可能更快。

相关内容

  • 没有找到相关文章

最新更新