SpockExecutionException:数据提供者没有数据

时间:2019-07-14 03:23:26

标签: groovy spock unroll

我已经做了很多搜索,虽然我发现了一些热门歌曲,例如Why does Spock think my Data Provider has no data?,但似乎都没有什么帮助。

我只做过几次数据提供者,但这似乎很完美。我有以下静态方法:

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

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

    return result;
}

然后我尝试将其用作数据提供程序,以在我的课程中调用函数:

@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)

就像我说的那样,这似乎很简单。有人有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

@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中定义像我这样的数据提供者并重新测试