我已经做了很多搜索,虽然我发现了一些热门歌曲,例如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)
就像我说的那样,这似乎很简单。有人有什么想法吗?
答案 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互连
因此要解决的分辨率方面: