Hello Jacoco users and devs,
I have a relatively weird problem on my hands and after one day of doing
everything that I could have thought of I still haven't found a solution.
In our project we have a set of public interfaces with default methods. The
default behaviour is that they throw UnsupportedOperationException, allowing
the implementations to decide which API level they want to support.
Since I wanted the team to use the same pattern for these interfaces, I've also
added a unit test that checks that all the interfaces from the public API
packages respect this pattern, by making sure we only expose default methods
and that when invoked (using reflection) they throw UOE.
Running the build locally on Mac OS X (Java 1.8.0_112, HotSpot), Windows
(1.8.0_121) and Linux (OpenJDK 1.8.0_131) everything works perfectly:
1. JaCoCo runs offline instrumentation (because we also have to use Powermock
for some of the tests)
2. we run the tests
3. JaCoCo restores the classes
4. we generate the coverage report
5. we run the check (every class has to be at least 80% covered, same applies
for the project)
When we try to run the same thing on Jenkins the check fails, since the
interfaces I told you about are not analysed at all.
Jenkins runs Java 1.8.0_121, also HotSpot. Comparing a local session with the
one from Jenkins clearly shows that the interfaces are missing altogether from
the analysis on Jenkins. Running the build in debug mode (mvn -X) didn't show
anything revealing. There's no JaCoCo plugin installed on Jenkins that could
clash with the project's setup.
Any advice about what should I check more?
For reference, this is the JaCoCo config (both the plugin and the agent have
the same version - currently 0.7.6, but I've had the same results with 0.7.9):
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>default-instrument</id>
<goals>
<goal>instrument</goal>
</goals>
</execution>
<execution>
<id>default-restore-instrumented-classes</id>
<goals>
<goal>restore-instrumented-classes</goal>
</goals>
</execution>
<execution>
<id>check-coverage</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<haltOnFailure>true</haltOnFailure>
<dataFile>${project.build.directory}/coverage.exec</dataFile>
<rules>
<rule>
<element>BUNDLE</element>
<limits>
<limit>
<counter>INSTRUCTION</counter>
<value>COVEREDRATIO</value>
<minimum>0.80</minimum>
</limit>
</limits>
</rule>
<rule>
<element>CLASS</element>
<limits>
<limit>
<counter>INSTRUCTION</counter>
<value>COVEREDRATIO</value>
<minimum>0.80</minimum>
</limit>
</limits>
</rule>
</rules>
<excludes>
<!-- private enum; cannot test valueOf / values
-->
<exclude>**/SocialMediaHelperImpl$WebsiteMetadata$Type.class</exclude>
</excludes>
</configuration>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${project.build.directory}/coverage.exec</dataFile>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<jacoco-agent.destfile>${project.build.directory}/coverage.exec</jacoco-agent.destfile>
</systemPropertyVariables>
</configuration>
</plugin>
And we also use the agent:
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>org.jacoco.agent</artifactId>
<version>${jacoco.version}</version>
<classifier>runtime</classifier>
<scope>test</scope>
</dependency>
Thanks,
Radu
--
You received this message because you are subscribed to the Google Groups
"JaCoCo and EclEmma Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jacoco/e10e3d48-3e2a-4668-9b43-a657c4d8ecb1%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.