All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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;
   }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy