Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

conflict with jmockit on java 11 #896

Closed
jitendra1331 opened this issue Jun 11, 2019 · 7 comments
Closed

conflict with jmockit on java 11 #896

jitendra1331 opened this issue Jun 11, 2019 · 7 comments
Labels
declined: otherproject 👽 This issue should be reported to other project

Comments

@jitendra1331
Copy link

jitendra1331 commented Jun 11, 2019

Jacoco is conflicting with jmockit on java 11
jacoco Version 0.8.4
gradle plugin tool version : 0.8.4
Version of JMockit that was used: 1.43
*Java Version : openjdk version "11.0.3" 2019-04-16 LTS
OpenJDK Runtime Environment Corretto-11.0.3.7.1 (build 11.0.3+7-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.3.7.1 (build 11.0.3+7-LTS, mixed mode)
Gradle version 5.3.1

Both jacoco and jmockit as configured as java agents. We get below stack trace when jacoco is used with jmockit. if jacoco agent configuration is removed, tests run as usual.

The setup works fine on java 8 system. We initially suspected issue with jmockit, and hence raised an issue on jmockit; jmockit/jmockit1#615

But were suggested that the issue may be at jacoco side.

Below is the stack trace.

at java.lang.ArrayIndexOutOfBoundsException.(ArrayIndexOutOfBoundsException.java:52)
at mockit.asm.util.BytecodeReader.readUnsignedShort(BytecodeReader.java:130)
at mockit.asm.classes.ClassReader.skipClassMembers(ClassReader.java:254)
at mockit.asm.classes.ClassReader.getAttributesStartIndex(ClassReader.java:240)
at mockit.asm.classes.ClassReader.positionAtBootstrapMethodsAttribute(ClassReader.java:269)
at mockit.asm.classes.ClassWriter.(ClassWriter.java:77)
at mockit.internal.BaseClassModifier.(BaseClassModifier.java:40)
at mockit.internal.expectations.mocking.MockedClassModifier.(MockedClassModifier.java:42)
at mockit.internal.expectations.mocking.BaseTypeRedefinition.createClassModifier(BaseTypeRedefinition.java:151)
at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineClassAndItsSuperClasses(BaseTypeRedefinition.java:182)
at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineMethodsAndConstructorsInTargetType(BaseTypeRedefinition.java:176)
at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineTargetClassAndCreateInstanceFactory(BaseTypeRedefinition.java:248)
at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineType(BaseTypeRedefinition.java:68)
at mockit.internal.expectations.mocking.TypeRedefinition.redefineType(TypeRedefinition.java:28)
at mockit.internal.expectations.mocking.FieldTypeRedefinitions.redefineFieldType(FieldTypeRedefinitions.java:78)
at mockit.internal.expectations.mocking.FieldTypeRedefinitions.redefineFieldType(FieldTypeRedefinitions.java:65)
at mockit.internal.expectations.mocking.FieldTypeRedefinitions.redefineFieldTypes(FieldTypeRedefinitions.java:53)
at mockit.internal.expectations.mocking.FieldTypeRedefinitions.(FieldTypeRedefinitions.java:33)
at mockit.integration.TestRunnerDecorator.handleMockFieldsForWholeTestClass(TestRunnerDecorator.java:142)
at mockit.integration.TestRunnerDecorator.updateTestClassState(TestRunnerDecorator.java:40)
at mockit.integration.junit4.JUnit4TestRunnerDecorator.handleMockingOutsideTestMethods(JUnit4TestRunnerDecorator.java:129)
at mockit.integration.junit4.JUnit4TestRunnerDecorator.invokeExplosively(JUnit4TestRunnerDecorator.java:37)
at mockit.integration.junit4.FakeFrameworkMethod.invokeExplosively(FakeFrameworkMethod.java:29)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:566)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy5.processTestClass(Unknown Source:-1)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:566)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.lang.Thread.run(Thread.java:834)
@Godin
Copy link
Member

Godin commented Jun 11, 2019

@jitendra1331 please provide complete reproducer as a zip-archive or as a GitHub repo.

@Godin Godin added the reproducer required Further information is requested label Jun 11, 2019
@Godin
Copy link
Member

Godin commented Jun 11, 2019

For Java 11+ class files JaCoCo version 0.8.4 uses condy (introduced in Java 11 - https://openjdk.java.net/jeps/309) - #845 , however looking at the code of JMockit clear that it doesn't handle condy properly - for example method mockit.asm.util.BytecodeReader.getItemSize incorrectly returns 3 in case of condy leading to ArrayIndexOutOfBoundsException, whereas should return 5; for another example there is no constant 17 corresponding to CONSTANT_Dynamic in mockit.asm.jvmConstants.ConstantPoolTypes.

As a temporary workaround while waiting for the fix in JMockit, you can use JaCoCo version 0.8.3.

@ekennedy80
Copy link

For Java 11+ class files JaCoCo version 0.8.4 uses condy (introduced in Java 11 - https://openjdk.java.net/jeps/309) - #845 , however looking at the code of JMockit clear that it doesn't handle condy properly - for example method mockit.asm.util.BytecodeReader.getItemSize incorrectly returns 3 in case of condy leading to ArrayIndexOutOfBoundsException, whereas should return 5; for another example there is no constant 17 corresponding to CONSTANT_Dynamic in mockit.asm.jvmConstants.ConstantPoolTypes.

As a temporary workaround while waiting for the fix in JMockit, you can use JaCoCo version 0.8.3.

I can verify that using 0.8.3 is a workaround to this problem.

@ryanmkurtz
Copy link

What about JDK 17? JaCoCo 0.8.3 is not compatible with that version.

@dlipofsky
Copy link

@ryanmkurtz , @beatjost, did either of you find a solution for Java 17?

@ryanmkurtz
Copy link

We just removed our jmockit usage altogether. It seemed like the easiest path forward.

@dlipofsky
Copy link

I haven't tried it myself but it looks like com.github.hazendaz.jmockit:jmockit:1.49.2 might be a fork that supports this. Personally I am just moving forward by migrating to mockito but I figured I'd mention the fork in case it helps someone.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
declined: otherproject 👽 This issue should be reported to other project
Projects
None yet
Development

No branches or pull requests

5 participants