在groovy中使用memoize

时间:2013-04-08 20:58:20

标签: unit-testing groovy tdd memoization spock

我目前正在使用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()
}

1 个答案:

答案 0 :(得分:0)

您无法从声明它的同一语句中引用getFibonacci变量。在分配getFibonacci.call之前,将call更改为def getFibonacci,或声明变量(getFibonacci = ...)。