mockit.internal.mockups.CaptureOfMockedUpImplementations Maven / Gradle / Ivy
/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal.mockups;
import java.lang.reflect.Type;
import javax.annotation.*;
import mockit.*;
import mockit.external.asm.*;
import mockit.internal.*;
import mockit.internal.capturing.*;
import static mockit.internal.util.Utilities.getClassType;
public final class CaptureOfMockedUpImplementations extends CaptureOfImplementations
{
private final MockClassSetup mockClassSetup;
public CaptureOfMockedUpImplementations(@Nonnull MockUp mockUp, @Nonnull Type baseType)
{
Class baseClassType = getClassType(baseType);
mockClassSetup = new MockClassSetup(baseClassType, baseType, mockUp, null);
}
@Nonnull @Override
protected BaseClassModifier createModifier(
@Nullable ClassLoader cl, @Nonnull ClassReader cr, @Nonnull Class baseType, Void typeMetadata)
{
return mockClassSetup.createClassModifier(cr);
}
@Override
protected void redefineClass(@Nonnull Class realClass, @Nonnull byte[] modifiedClass)
{
mockClassSetup.applyClassModifications(realClass, modifiedClass);
}
@Nullable
public Class apply()
{
@SuppressWarnings("unchecked") Class baseType = (Class) mockClassSetup.realClass;
Class baseClassType = baseType;
Class mockedClass = null;
if (baseType.isInterface()) {
mockedClass = new MockedImplementationClass(mockClassSetup.mockUp).createImplementation(baseType);
baseClassType = mockedClass;
}
if (baseClassType != Object.class) {
redefineClass(baseClassType, baseType, null);
}
makeSureAllSubtypesAreModified(baseType, false, null);
return mockedClass;
}
}