renatoathaydes / spock-reports

This project creates a global extension to Spock to create test reports.
Apache License 2.0
273 stars 68 forks source link

Unable to create reports using gradle #224

Closed KarthikRIyer closed 2 years ago

KarthikRIyer commented 2 years ago

I'm trying to use spock-reports in a gradle project. I'm using java 8.

I'm getting this error when I run a test:

[Test worker] INFO com.athaydes.spockframework.report.SpockReportExtension - Got configuration from Spock: com.athaydes.spockframework.report.internal.SpockReportsConfiguration([:])
[Test worker] INFO com.athaydes.spockframework.report.internal.ConfigLoader - SpockReports config loaded: {com.athaydes.spockframework.report.aggregatedJsonReportDir=, com.athaydes.spockframework.report.showCodeBlocks=false, com.athaydes.spockframework.report.template.TemplateReportCreator.reportFileExtension=md, com.athaydes.spockframework.report.testSourceRoots=src/test/groovy, com.athaydes.spockframework.report.IReportCreator=com.athaydes.spockframework.report.internal.HtmlReportCreator, com.athaydes.spockframework.report.outputDir=build/reports/spock, com.athaydes.spockframework.report.internal.HtmlReportCreator.inlineCss=true, com.athaydes.spockframework.report.internal.HtmlReportCreator.featureReportCss=spock-feature-report.css, com.athaydes.spockframework.report.hideEmptyBlocks=false, com.athaydes.spockframework.report.internal.HtmlReportCreator.summaryReportCss=spock-summary-report.css, com.athaydes.spockframework.report.projectVersion=Unknown, com.athaydes.spockframework.report.template.TemplateReportCreator.specTemplateFile=/templateReportCreator/spec-template.md, com.athaydes.spockframework.report.internal.HtmlReportCreator.specSummaryNameOption=class_name_and_title, com.athaydes.spockframework.report.template.TemplateReportCreator.summaryTemplateFile=/templateReportCreator/summary-template.md, com.athaydes.spockframework.report.internal.HtmlReportCreator.excludeToc=false, com.athaydes.spockframework.report.template.TemplateReportCreator.enabled=true, com.athaydes.spockframework.report.projectName=, com.athaydes.spockframework.report.template.TemplateReportCreator.summaryFileName=summary.md, com.athaydes.spockframework.report.internal.HtmlReportCreator.printThrowableStackTrace=false, com.athaydes.spockframework.report.internal.HtmlReportCreator.enabled=true}
[Test worker] WARN com.athaydes.spockframework.report.SpockReportExtension - Failed to create instance of com.athaydes.spockframework.report.internal.HtmlReportCreator
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.athaydes.spockframework.report.SpockReportExtension.instantiateReportCreator(SpockReportExtension.groovy:88)
    at com.athaydes.spockframework.report.SpockReportExtension.instantiateReportCreatorAndApplyConfig(SpockReportExtension.groovy:97)
    at com.athaydes.spockframework.report.SpockReportExtension$_start_closure2.doCall(SpockReportExtension.groovy:59)
    at com.athaydes.spockframework.report.SpockReportExtension$_start_closure2.call(SpockReportExtension.groovy)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3575)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3560)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3660)
    at com.athaydes.spockframework.report.SpockReportExtension.start(SpockReportExtension.groovy:57)
    at org.spockframework.runtime.GlobalExtensionRegistry.startGlobalExtensions(GlobalExtensionRegistry.java:138)
    at org.spockframework.runtime.RunContext.start(RunContext.java:62)
    at org.spockframework.runtime.RunContext.get(RunContext.java:167)
    at org.spockframework.runtime.SpockEngine.discover(SpockEngine.java:21)
    at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:103)
    at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:85)
    at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:92)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
    at com.sun.proxy.$Proxy2.stop(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:133)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoClassDefFoundError: groovy/xml/MarkupBuilder
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetPublicMethods(Class.java:2902)
    at java.lang.Class.getMethods(Class.java:1615)
    at java.beans.Introspector.getPublicDeclaredMethods(Introspector.java:1336)
    at java.beans.Introspector.getTargetMethodInfo(Introspector.java:1197)
    at java.beans.Introspector.getBeanInfo(Introspector.java:426)
    at java.beans.Introspector.getBeanInfo(Introspector.java:173)
    at groovy.lang.MetaClassImpl.lambda$addProperties$4(MetaClassImpl.java:3460)
    at java.security.AccessController.doPrivileged(Native Method)
    at groovy.lang.MetaClassImpl.addProperties(MetaClassImpl.java:3460)
    at groovy.lang.MetaClassImpl.reinitialize(MetaClassImpl.java:3442)
    at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:3435)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:273)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:315)
    at com.athaydes.spockframework.report.internal.HtmlReportCreator.$getStaticMetaClass(HtmlReportCreator.groovy)
    at com.athaydes.spockframework.report.internal.AbstractHtmlCreator.<init>(AbstractHtmlCreator.groovy:18)
    at com.athaydes.spockframework.report.internal.HtmlReportCreator.<init>(HtmlReportCreator.groovy)
    ... 49 more
Caused by: java.lang.ClassNotFoundException: groovy.xml.MarkupBuilder
    at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 67 more
[Test worker] WARN com.athaydes.spockframework.report.SpockReportExtension - Not creating report for ItemSpockTest as reportCreator is null

Here's relevant part of my build.gradle file. Here's a link to the complete build.gradle file if that's helpful.

import org.gradle.internal.os.OperatingSystem

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.+'
    }
}

plugins {
    id 'java'
    id 'groovy'
    id 'java-library'
    id 'maven-publish'
    id 'maven'
}

repositories {
    mavenLocal()
    mavenCentral()
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    testImplementation 'com.fasterxml.jackson.core:jackson-databind:2.8.9'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0'
    testCompile "org.spockframework:spock-core:2.0-groovy-3.0"
    // you can use testRuntimeClasspath if you don't want to use spock-report-specific features in your Specs
    testImplementation( "com.athaydes:spock-reports:2.1.1-groovy-3.0" ) {
        transitive = false // this avoids affecting your version of Groovy/Spock
    }
    // if you don't already have slf4j-api and an implementation of it in the classpath, add this!
    testImplementation 'org.slf4j:slf4j-api:1.7.30'
    testRuntimeClasspath 'org.slf4j:slf4j-simple:1.7.30'
}
version = '0.14.0-beta-2'

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

test {
    useJUnitPlatform()
    systemProperty "file.encoding", "utf-8"
    systemProperty 'com.athaydes.spockframework.report.outputDir', 'build/reports/spock'
}

Here's my test I'm trying to run:

package io.opentimeline

import io.opentimeline.opentime.RationalTime
import io.opentimeline.opentime.TimeRange
import io.opentimeline.opentimelineio.Item
import spock.lang.Specification

class ItemSpockTest extends Specification {

    def "Test item is disabled"() {
        given: "An item is created"
        def item = new Item.ItemBuilder()
                .setSourceRange(new TimeRange.TimeRangeBuilder()
                        .setDuration(new RationalTime(10, 1))
                        .build())
                .build()

        verifyAll {
            item.isEnabled()
        }

        when: "Item is disabled"
        item.setEnabled(false)

        then: "Item does not contribute to the composition"
        verifyAll {
            (!item.isEnabled())
        }
    }
}

I would appreciate any help! Thanks!

renatoathaydes commented 2 years ago

You need to add the following dependencies to your tests:

testRuntime "org.codehaus.groovy:groovy-xml:${groovyVersion}"
testRuntime "org.codehaus.groovy:groovy-json:${groovyVersion}"
testRuntime "org.codehaus.groovy:groovy-templates:${groovyVersion}"

After you do this, let me know if it works.

renatoathaydes commented 2 years ago

This is documented here.

The Groovy version should be at least 3.0.9.

KarthikRIyer commented 2 years ago

This worked! Thanks a lot for the help @renatoathaydes