SpockExecutionException:数据提供者没有数据

SpockExecutionException: Data provider has no data

我进行了大量搜索,虽然我找到了一些结果,例如 Why does Spock think my Data Provider has no data?,但其中 none 似乎非常有帮助。

我只做过几次数据提供者,但它似乎非常适合这个。我有以下静态方法:

static List<ContactPointType> getAddressTypes() {
    List<ContactPointType> result = new ArrayList<>();

    for (ContactPointType cpType : ContactPointType.values()) {
        if (cpType.toString().endsWith("Addr")) {
            result.add(cpType);
        }
    }

    return result;
}

然后我尝试将它用作数据提供程序来调用我的函数 class:

@Unroll("#cpType should be address")
def "isAddress addresses"() {
    expect: "isAddress() to be true"
    contactPoint.isAddress(cpType)

    where:
    cpType << getAddressTypes()
}

当我 运行 这个时,我得到:

org.spockframework.runtime.SpockExecutionException: Data provider has no data

    at org.spockframework.runtime.JUnitSupervisor.afterFeature(JUnitSupervisor.java:191)
    at org.spockframework.runtime.BaseSpecRunner.runFeature(BaseSpecRunner.java:236)

就像我说的,这看起来很简单。有人有什么想法吗?

好吧,我已经尝试了数据提供程序功能,它按预期工作:

@Unroll("max(1, #cpType) == #cpType")
class MyFirstSpec extends Specification {
  def "let's try this!"() {
     expect:
       Math.max(1, cpType) == cpType
     where:
       cpType << dataProvider()
  }

  List<Integer> dataProvider() {
      [2,3,4]
  } 
}

但是,如果我像这样重写 dataProvider 函数,我会看到您提到的异常:

 List<Integer> dataProvider() {
   [] // returns an empty list
 }

产量:

 org.spockframework.runtime.SpockExecutionException: Data provider has no data
  at org.spockframework.runtime.JUnitSupervisor.afterFeature(JUnitSupervisor.java:180)
  at org.spockframework.runtime.BaseSpecRunner.runFeature(BaseSpecRunner.java:239)

所以我的想法是,您可能最终在数据提供程序实现中得到一个空列表,这就是它不起作用的原因

另一种可能(尽管老实说有点不太现实)是你搞砸了Groovy/Java互连

因此,就总结而言:

  1. 尝试使用一些更直接的数据提供程序实现并对其进行测试
  2. 如果它不起作用 - 只需在 Groovy 和 re-test
  3. 中定义像我这样的数据提供者