我可以在对 Spock 中的 Stub 方法的调用中添加延迟吗?

Can I add a delay to a call to a Stub method in Spock?

我正在使用 Spock 框架来测试一些 Java 类。我需要做的一件事是向我正在调用的 Stub 方法添加延迟,以模拟 long-运行 方法。这可能吗?

这看起来可以使用 Mockito:Can I delay a stubbed method response with Mockito?。可以使用 Spock 吗?

One thing I need to do is add a delay to a Stub method that I'm calling, in order to simulate a long-running method. Is this possible?

在不了解更多被测情况的情况下很难确定这样做是否正确,但是如果您正在执行一个方法并希望它导致当前线程占用一段时间以模拟工作,你的模拟方法可以调用 Thread.sleep.

Spock 是一个 Groovy 工具。因此,你有一些语法糖并且不需要围绕 Thread.sleep 进行乏味的 try-catch。你只需写:

// Sleep for 2.5 seconds
sleep 2500

您的测试可能如下所示:

class Calculator {
  int multiply(int a, int b) {
    return a * b
  }
}
class MyClass {
  private final Calculator calculator

  MyClass(Calculator calculator) {
    this.calculator = calculator
  }

  int calculate() {
    return calculator.multiply(3, 4)
  }
}
import spock.lang.Specification

import static java.lang.System.currentTimeMillis

class WaitingTest extends Specification {
  static final int SLEEP_MILLIS = 250

  def "verify slow multiplication"() {
    given:
    Calculator calculator = Stub() {
      multiply(_, _) >> {
        sleep SLEEP_MILLIS
        42
      }
    }
    def myClass = new MyClass(calculator)
    def startTime = currentTimeMillis()

    expect:
    myClass.calculate() == 42
    currentTimeMillis() - startTime > SLEEP_MILLIS
  }
}

Try it in the Groovy web console.