1

When generating unit test reports using spock-reports, I'm getting a ClassCastException:

class [B cannot be cast to class [C ([B and [C are in module java.base of loader 'bootstrap')

I'm using Java 11 with Spock 2.0 for unit tests and spock-reports (2.0.1-RC3) to generate test reports, initiated by surefire (2.22.2). I also use the spock collaborators (1.2.2) extension.

Although individual test reports are created successfully, when spock-reports tries to generate the aggregate HTML report (index.html), it gets:

c.a.s.r.internal.HtmlReportAggregator    : Failed to create aggregated report

java.lang.ClassCastException: class [B cannot be cast to class [C ([B and [C are in module java.base of loader 'bootstrap')
    at groovy.json.internal.FastStringUtils$StringImplementation$1.toCharArray(FastStringUtils.java:88) ~[groovy-all-2.3.8.jar:2.3.8]
    at groovy.json.internal.FastStringUtils.toCharArray(FastStringUtils.java:175) ~[groovy-all-2.3.8.jar:2.3.8]
    at groovy.json.internal.BaseJsonParser.parse(BaseJsonParser.java:103) ~[groovy-all-2.3.8.jar:2.3.8]
    at groovy.json.JsonSlurper.parseText(JsonSlurper.java:208) ~[groovy-all-2.3.8.jar:2.3.8]
    at groovy.json.JsonSlurper$parseText.call(Unknown Source) ~[na:na]
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) ~[groovy-3.0.9.jar:3.0.9]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) ~[groovy-3.0.9.jar:3.0.9]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139) ~[groovy-3.0.9.jar:3.0.9]
    at com.athaydes.spockframework.report.internal.ReportDataAggregator$_getAllAggregatedDataAndPersistLocalData_closure1.doCall(ReportDataAggregator.groovy:44) ~[spock-reports-2.3.0-groovy-3.0.jar:2.3.0-groovy-3.0]

I can see from the stacktrace that Spock is using groovy 3.0.9 but groovy-all 2.3.8 is being pulled in (by the spock-collaborators extension).

Although I can and will investigate updating the various dependency versions, is there anything I can do in the meantime to prevent this exception so that index.html can be generated?

roj
  • 1,262
  • 13
  • 27

1 Answers1

1

System Property

Aside from updating the other dependencies to later versions and aligning groovy versions, which ought to resolve it, a quick fix is to declare a system property:

groovy.json.faststringutils.disable=true

We can set this for our tests by adding it as a surefire systemPropertyVaribles configuration entry in pom.xml:

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <systemPropertyVariables>
      <groovy.json.faststringutils.disable>true</groovy.json.faststringutils.disable>
    </systemPropertyVariables>
    ...
  ...
</plugin>

This was enough to get index.html generating successfully for us whilst I investigated uplifting dependency versions.

Dependency Versions

The alternative way of fixing is to uplift dependencies to the following versions (the ones you use):

  • spock-reports: 2.3.0-groovy-3.0
  • spock-subjects-collaborators-extension: 2.0.0
  • maven-surefire-plugin: 3.0.0-M5

and add a direct groovy-all dependency (test scope, since we're only using groovy for our tests):

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>3.0.10</version>
    <scope>test</scope>
    <type>pom</type>
</dependency>
roj
  • 1,262
  • 13
  • 27
  • 1
    Finally someone who answers his own question comprehensively, taking time to document his findings. This should be the normal case, but most people around here are selfish, asking lots of questions, but when they happen to be able to solve their own problems, simply writing a sloppy answer or no answer at all. – kriegaex Mar 23 '22 at 09:01