我想测试具有一些尾部递归功能的代码。我无法模拟尾部递归功能,因为它们需要声明Final
或Private
。大多数模拟框架不支持模拟此类方法,而支持的方法则无法正常工作。
这根本可以吗?有人可以为我提供他们的想法来模拟尾部递归功能吗?
我尝试使用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
方法不需要final
或private
,因此可以覆盖测试。
这种模式的另一个优点是累加器值res
不必在主函数接口中公开。此模式还允许在主要递归代码之外处理特殊情况,从而使内部代码更加简单,可能更快。