Skip to content

ArrayIndexOutOfBounds while creating mocks #664

Closed
@vimil

Description

@vimil

Please provide the following information:

*1.48, 1.49

  • Description of the problem or enhancement request:
    When running junit tests with coverage, jmockit throws ArrayIndexOutOfbounds. This happens for java 11 classes

Below is the stacktrace of the exception

java.lang.ArrayIndexOutOfBoundsException: Index 10316 out of bounds for length 776 at mockit.asm.util.BytecodeReader.readString(BytecodeReader.java:346) at mockit.asm.util.BytecodeReader.readNonnullUTF8(BytecodeReader.java:338) at mockit.asm.util.BytecodeReader.readMethodHandle(BytecodeReader.java:426) at mockit.asm.util.BytecodeReader.readConst(BytecodeReader.java:401) at mockit.asm.util.BytecodeReader.readConstItem(BytecodeReader.java:365) at mockit.asm.methods.MethodReader.readLDCW(MethodReader.java:481) at mockit.asm.methods.MethodReader.readBytecodeInstructionsInCodeBlock(MethodReader.java:405) at mockit.asm.methods.MethodReader.readCode(MethodReader.java:211) at mockit.asm.methods.MethodReader.readMethodBody(MethodReader.java:134) at mockit.asm.methods.MethodReader.readMethod(MethodReader.java:75) at mockit.asm.methods.MethodReader.readMethods(MethodReader.java:62) at mockit.asm.classes.ClassReader.readFieldsAndMethods(ClassReader.java:196) at mockit.asm.classes.ClassReader.accept(ClassReader.java:89) at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineClass(BaseTypeRedefinition.java:205) at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineClassAndItsSuperClasses(BaseTypeRedefinition.java:182) at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineMethodsAndConstructorsInTargetType(BaseTypeRedefinition.java:173) at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineTargetClassAndCreateInstanceFactory(BaseTypeRedefinition.java:245) at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineType(BaseTypeRedefinition.java:65) 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.<init>(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) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at mockit.internal.reflection.MethodReflection.invoke(MethodReflection.java:90) at mockit.internal.BaseInvocation.doProceed(BaseInvocation.java:57) at mockit.Invocation.proceed(Invocation.java:107) at com.cwctravel.framework.test.jmockit.MockFrameworkMethod.invokeExplosively(MockFrameworkMethod.java:43) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:55) 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.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)

The issue was partially resolved by adding support for Condy Constant Pool Type but the ByteCodeReader class still needs to be enhanced to read readLDCW byteCode instruction correctly

Here is an initial pullrequest with potential fix #665

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions