3

假设我有一个将一些数据填充到列表中的方法,它在内部调用了另外一个方法(我正在独立测试)并将一些数据填充到列表中。这里最好的测试方法是什么?

如何测试外部方法?我是否也应该检查来自内部方法的数据,否则可以只测试由外部方法填充的数据吗?

4

1 回答 1

6

给定以下测试类:

class MyTestClass {
    int getAPlusB() { return getA() + getB() }
    int getA() { return 1 }
    int getB() { return 2 }
}

我可以编写以下 spock 测试来检查算术是否正确,但也可以getA()通过以下getB()方式实际调用getAPlusB()

def "test using all methods"() { 
    given: MyTestClass thing = Spy(MyTestClass)
    when:  def answer = thing.getAPlusB()
    then:  1 * thing.getA()
           1 * thing.getB()
           answer == 3
}

到目前为止,这是在所有 3 个方法上运行所有代码 - getA 和 getB 被验证为被调用,但这些方法中的代码实际上正在执行。在您的情况下,您正在单独测试内部方法,也许您根本不想在此测试期间调用它们。通过使用 spock spy,您可以实例化被测类的真实实例,但可以选择存根您想要指定返回值的特定方法:

def "test which stubs getA and getB"() {
   given: MyTestClass thing = Spy(MyTestClass)
   when:  def answer = thing.getAPlusB()
   then:  1 * thing.getA() >> 5
          1 * thing.getB() >> 2
          answer == 7
}
于 2013-03-06T17:02:33.163 回答