我目前正在使用spock在groovy中练习测试驱动开发。 我有一组测试,其中3个不同的实现做同样的事情:迭代,递归和memoized。 所以我创建了一个抽象类来保存测试,然后创建了3个不同的文件来返回运行测试的具体类实现。我有迭代和递归工作,但我遇到memoize()
的问题import spock.lang.Specification
abstract class FibonacciTest extends Specification {
private calculator
abstract def getCalculator()
def setup() {
calculator = getCalculator()
}
def "test canary"() {
expect:
true
}
// more tests
}
class RecursiveFibonacciTest extends FibonacciTest {
def getCalculator() {
new RecursiveCalculator()
}
}
class IterativeFibonacciTest extends FibonacciTest {
def getCalculator() {
new IterativeCalculator()
}
}
class MemoizeFibonacciTest extends FibonacciTest {
def getCalculator() {
new MemoizeCalculator()
}
}
class RecursiveCalculator {
def getFibonacci(position) {
if (position < 2) {
1
}
else {
getFibonacci(position - 1) + getFibonacci(position - 2)
}
}
}
class IterativeCalculator {
def getFibonacci(position) {
if (position < 2) {
1
}
else {
def value = 1
def previousValue = 1
for (i in 2..position) {
def temporaryValue = previousValue
previousValue = value
value = temporaryValue + previousValue
}
value
}
}
}
所以我有迭代和递归工作,但是让memoize工作有问题..我认为它应该适用于此,但它不是..任何人都知道我做错了什么?
class MemoizeCalculator {
def getFibonacci = { position ->
if (position < 2)
1
else
getFibonacci.call(position - 1) + getFibonacci.call(position - 2)
}.memoize()
}
答案 0 :(得分:0)
您无法从声明它的同一语句中引用getFibonacci
变量。在分配getFibonacci.call
之前,将call
更改为def getFibonacci
,或声明变量(getFibonacci = ...
)。