/*
* Copyright (c) 2006-2013 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal.mockups;
import mockit.external.asm4.*;
import mockit.internal.*;
import mockit.internal.startup.*;
import mockit.internal.state.*;
public final class ClassStubbing
{
private final Class<?> realClass;
public ClassStubbing(Class<?> realClass) { this.realClass = realClass; }
public void stubOut()
{
byte[] modifiedClassFile = stubOutClass();
String classDesc = Type.getInternalName(realClass);
TestRun.mockFixture().addRedefinedClass(classDesc, realClass, modifiedClassFile);
}
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, 0);
byte[] modifiedClassFile = rcWriter.toByteArray();
Startup.redefineMethods(realClass, modifiedClassFile);
return modifiedClassFile;
}
public void stubOutAtStartup() { stubOutClass(); }
}