mockit.internal.mockups.ClassStubbing Maven / Gradle / Ivy
/*
* Copyright (c) 2006-2014 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal.mockups;
import org.jetbrains.annotations.*;
import mockit.external.asm4.*;
import mockit.internal.*;
import mockit.internal.startup.*;
import mockit.internal.state.*;
public final class ClassStubbing
{
@NotNull private final Class> realClass;
public ClassStubbing(@NotNull Class> realClass) { this.realClass = realClass; }
public void stubOut()
{
byte[] modifiedClassFile = stubOutClass();
String classDesc = Type.getInternalName(realClass);
TestRun.mockFixture().addRedefinedClass(classDesc, realClass, modifiedClassFile);
}
@NotNull private byte[] stubOutClass()
{
if (realClass.isInterface() || realClass.isArray()) {
throw new IllegalArgumentException("Not a modifiable class: " + realClass.getName());
}
ClassReader rcReader = ClassFile.createReaderFromLastRedefinitionIfAny(realClass);
ClassVisitor rcWriter = new StubOutModifier(rcReader);
rcReader.accept(rcWriter, ClassReader.SKIP_FRAMES);
byte[] modifiedClassFile = rcWriter.toByteArray();
Startup.redefineMethods(realClass, modifiedClassFile);
return modifiedClassFile;
}
}