jmockit/jmockit1

java.lang.InternalError: class redefinition failed: invalid class

beatjost opened this issue · 0 comments

Versions/Environement

  • JMockit version: 1.49
  • Gradle version: 5.6.4
  • Java version: 11
  • JUnit 5.5.2

Some junit tests are failing with a strange exeption:

java.lang.InternalError: class redefinition failed: invalid class at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses0(Native Method) at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:167) at mockit.internal.startup.Startup.retransformClass(Startup.java:58) at mockit.internal.state.CachedClassfiles.getClassfile(CachedClassfiles.java:123) at mockit.internal.ClassFile.createReaderOrGetFromCache(ClassFile.java:92) at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineClassAndItsSuperClasses(BaseTypeRedefinition.java:178) 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.junit5.JMockitExtension.postProcessTestInstance(JMockitExtension.java:52)

Guess this is somehow related to the "MinioClient", as all of the failing classes have this dependency.
Here is a sample test:

public class RemoverTest {

	@Tested
	Remover remover;
	@Mocked
	MinioClient minioClient;
	@Injectable
	String EXPIRES = "2323";
	@Injectable
	DocumentRepository documentRepo;
	@Injectable
	AuthorizationHelper authHelper;
	@Injectable
	DocumentService documentService;

	@Test
	public void testDelete() throws Exception {
		new Expectations() {{
			remover.delete("bucket", "filename");
			result = new InvalidEndpointException(anyString, anyString);
		}};
		ResponseEntity<Void> response = remover.delete("bucket", "filename");
		assertEquals(response.getStatusCode(), HttpStatus.INTERNAL_SERVER_ERROR);
	}
}

It fails somehow in the Mockit::Startkup class (instrumentation)

   @SuppressWarnings("ConstantConditions")
   public static void retransformClass(@Nonnull Class<?> aClass) {
      try { instrumentation.retransformClasses(aClass); } catch (UnmodifiableClassException ignore) {}
   }

Any idea or hints how to solve this, all the other tests run fine...

image