0

我做了一堆搜索,虽然我找到了一些结果,比如为什么 Spock 认为我的数据提供者没有数据?,它们似乎都不是很有帮助。

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

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)

就像我说的,这似乎很简单。有没有人有任何想法?

4

1 回答 1

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 中定义像我这样的数据提供者并重新测试
于 2019-07-14T10:35:13.250 回答