Ignore constructor coverage

66 views
Skip to first unread message

m...@thomaskeller.biz

unread,
Jan 16, 2019, 12:04:47 PM1/16/19
to JaCoCo and EclEmma Users
Hi all!

I know ignoring private constructors is a hot topic and debate, but I was wondering if there is a general knob somewhere to just ignore all constructor coverage in Jacoco.

My use case is poor-mans (TM) dependency injection. I have a lot of cascading private constructors that just build my dependencies, there is no testable code in those. In small modules with a few classes this "glue" code tremendously changes the instruction coverage I receive.

I guess some kind of annotation to ignore elements would be fine as well - this way it would be explicit - but I noticed that https://github.com/jacoco/jacoco/issues/14 is long open.

Any ideas?

Thanks in advance,
Thomas.

Marc Hoffmann

unread,
Jan 16, 2019, 1:19:27 PM1/16/19
to jac...@googlegroups.com
Hi Thomas,

unfortunately there is no "general knob” to exclude constructors in general.

As a workaround you can define an annotation with the local name “Generated” and annotate your DI constructors. See our change log:


Regards,
-marc





--
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 jacoco+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jacoco/262649cb-cc38-4bc0-b2e2-175e105a0c51%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

m...@thomaskeller.biz

unread,
Jan 17, 2019, 7:19:49 AM1/17/19
to JaCoCo and EclEmma Users
Hi Marc!

I build Jacoco locally (current master) and uploaded the artifacts to our Nexus. Then, when thrown at my unaltered project, it threw an exception right at the start:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':common-util:jacocoDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:110)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
at org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute(LocalTaskInfoExecutor.java:42)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:277)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:262)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:135)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:130)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.execute(DefaultTaskPlanExecutor.java:200)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.executeWithWork(DefaultTaskPlanExecutor.java:191)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.run(DefaultTaskPlanExecutor.java:130)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.workers.WorkerExecutionException: There were multiple failures while executing work items
at org.gradle.workers.internal.DefaultWorkerExecutor.workerExecutionException(DefaultWorkerExecutor.java:157)
at org.gradle.workers.internal.DefaultWorkerExecutor.await(DefaultWorkerExecutor.java:149)
at com.android.build.gradle.internal.tasks.JacocoTaskDelegate.run(JacocoTaskDelegate.java:100)
at com.android.build.gradle.internal.tasks.JacocoTask.run(JacocoTask.java:77)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:50)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:131)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:120)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:99)
... 31 more
Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.internal.tasks.JacocoTaskDelegate$JacocoWorkerAction
at org.gradle.workers.internal.DefaultWorkerExecutor$WorkerExecution.waitForCompletion(DefaultWorkerExecutor.java:274)
at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:115)
at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:87)
at org.gradle.workers.internal.DefaultWorkerExecutor.await(DefaultWorkerExecutor.java:147)
... 45 more
Caused by: java.lang.ExceptionInInitializerError
at org.jacoco.core.instr.Instrumenter.instrument(Instrumenter.java:97)
at org.jacoco.core.instr.Instrumenter.instrument(Instrumenter.java:118)
at org.jacoco.core.instr.Instrumenter.instrument(Instrumenter.java:145)
at com.android.build.gradle.internal.tasks.JacocoTaskDelegate$JacocoWorkerAction.run(JacocoTaskDelegate.java:294)
at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:39)
at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:25)
at org.gradle.workers.internal.IsolatedClassloaderWorkerFactory$WorkerCallable.call(IsolatedClassloaderWorkerFactory.java:177)
at org.gradle.workers.internal.IsolatedClassloaderWorkerFactory.executeInWorkerClassLoader(IsolatedClassloaderWorkerFactory.java:105)
at org.gradle.workers.internal.IsolatedClassloaderWorkerFactory.access$100(IsolatedClassloaderWorkerFactory.java:54)
at org.gradle.workers.internal.IsolatedClassloaderWorkerFactory$1$1.call(IsolatedClassloaderWorkerFactory.java:78)
at org.gradle.workers.internal.IsolatedClassloaderWorkerFactory$1$1.call(IsolatedClassloaderWorkerFactory.java:75)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:314)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:304)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:100)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.workers.internal.IsolatedClassloaderWorkerFactory$1.execute(IsolatedClassloaderWorkerFactory.java:75)
at org.gradle.workers.internal.DefaultWorkerExecutor$1.call(DefaultWorkerExecutor.java:102)
at org.gradle.workers.internal.DefaultWorkerExecutor$1.call(DefaultWorkerExecutor.java:96)
at org.gradle.internal.work.AbstractConditionalExecution$1.run(AbstractConditionalExecution.java:38)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:212)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:161)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:130)
... 3 more
Caused by: java.lang.IllegalArgumentException
at org.objectweb.asm.MethodVisitor.<init>(MethodVisitor.java:93)
at org.jacoco.core.internal.flow.MethodProbesVisitor.<init>(MethodProbesVisitor.java:39)
at org.jacoco.core.internal.flow.MethodProbesVisitor.<init>(MethodProbesVisitor.java:29)
at org.jacoco.core.internal.flow.ClassProbesAdapter$1.<init>(ClassProbesAdapter.java:26)
at org.jacoco.core.internal.flow.ClassProbesAdapter.<clinit>(ClassProbesAdapter.java:26)
... 26 more


Is this a known issue? I'd love to give the new Kotlin functionality as well as @Generated support a try!

m...@thomaskeller.biz

unread,
Jan 17, 2019, 7:21:32 AM1/17/19
to JaCoCo and EclEmma Users
> Is this a known issue? I'd love to give the new Kotlin functionality as well as @Generated support a try!

This is btw Gradle 4.10.2 with Android Gradle Plugin 3.3.0 final on macOS.

Thomas.

Evgeny Mandrikov

unread,
Jan 17, 2019, 7:44:17 AM1/17/19
to jac...@googlegroups.com
ASM version 7.0 is required, however looks like you use another ASM version.

  • everything is correct on JaCoCo side - it correctly declares versions of dependencies
  • check dependencies of your build scripts
  • IMO developers of Android SDK can/should think about better integration of JaCoCo library to avoid such classpath conflicts,  maybe you can report this to them


Regards,
Evgeny


--
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 jacoco+un...@googlegroups.com.

Thomas Keller

unread,
Jan 17, 2019, 9:57:49 AM1/17/19
to jac...@googlegroups.com, Marc Hoffmann
Ah, that's nice! I've seen a couple of other Kotlin-related fixes in 0.8.3 - is there any ETA for a release?

Thanks,
Thomas.
--
Diese Nachricht wurde von meinem Android-Gerät mit K-9 Mail gesendet.

m...@thomaskeller.biz

unread,
Jan 18, 2019, 2:52:05 AM1/18/19
to JaCoCo and EclEmma Users
Ah, thanks for the pointer! I think the issue was caused by my manual Nexus upload, as this did not include all the necessary transitive dependencies.

Thomas.

m...@thomaskeller.biz

unread,
Jan 18, 2019, 3:16:56 AM1/18/19
to JaCoCo and EclEmma Users
Am Freitag, 18. Januar 2019 08:52:05 UTC+1 schrieb Thomas Keller:
> Ah, thanks for the pointer! I think the issue was caused by my manual Nexus upload, as this did not include all the necessary transitive dependencies.

I think I wait for a regular release. My maven foo is very rusty these days and I cannot get a local maven upload working on my side, unfortunately (running mvn deploy in org.jacoco.build with a custom snapshot repository configured in the pom.xml leads to "Failed to deploy artifacts: Could not find artifact org.jacoco:org.jacoco.build:pom:0.8.3-20190118.081538-1 in <myrepo>" error).

Thanks anyways,
Thomas.

Reply all
Reply to author
Forward
This conversation is locked
You cannot reply and perform actions on locked conversations.
0 new messages