groovyspockunroll

SpockExecutionException: Data provider has no data


I've done a bunch of searching and, while I've found a few hits, like Why does Spock think my Data Provider has no data?, none of them seem to be very helpful.

I've only done a data provider a couple of times, but it seems perfect for this. I have the following static method:

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

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

    return result;
}

And then I'm trying to use it as a data provider for calling a function on my class:

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

    where:
    cpType << getAddressTypes()
}

When I run this, I get:

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)

Like I said, it seems pretty straightforward. Does anyone have any ideas?


Solution

  • Well, I've tried the data provider feature and it works as expected:

    @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]
      } 
    }
    

    However if I rewrite the dataProvider function like this, I see the exception that you've mentioned:

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

    Yields:

     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)
    

    So my idea is that probably you end up with an empty list in the data provider implementation and that's why it doesn't work

    Another possible (although slightly less realistic idea to be honest) is that you've messed something up with Groovy/Java interconnection

    So in terms of resolution to wrap up:

    1. Try to use some more straightforward data provider implementation and test it
    2. If it doesn't work - just define data provider like me in Groovy and re-test