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

mockit.internal.expectations.mocking.TestedClassRedefinitions Maven / Gradle / Ivy

/*
 * Copyright (c) 2006-2011 Rogério Liesenfeld
 * This file is subject to the terms of the MIT license (see LICENSE.txt).
 */
package mockit.internal.expectations.mocking;

import java.lang.instrument.*;
import java.lang.reflect.*;
import java.util.*;

import mockit.*;
import mockit.external.asm.*;
import mockit.internal.*;

final class TestedClassRedefinitions
{
   final List testedFields;
   final List injectableFields;
   private final List mockedTypes;

   TestedClassRedefinitions()
   {
      testedFields = new LinkedList();
      injectableFields = new ArrayList();
      mockedTypes = new ArrayList();
   }

   boolean redefineTestedClasses(Object objectWithTestedFields)
   {
      for (Field field: objectWithTestedFields.getClass().getDeclaredFields()) {
         if (field.isAnnotationPresent(Tested.class)) {
            testedFields.add(field);
         }
         else {
            MockedType mockedType = new MockedType(field, true);

            if (mockedType.injectable) {
               injectableFields.add(mockedType);
            }

            if (mockedType.isMockField()) {
               mockedTypes.add(mockedType);
            }
         }
      }

      for (Field testedField : testedFields) {
         redefineTestedClass(testedField.getType());
      }

      return !testedFields.isEmpty();
   }

   private void redefineTestedClass(Class testedClass)
   {
      ClassReader cr = ClassFile.createClassFileReader(testedClass.getName());
      TestedClassModifier modifier = new TestedClassModifier(cr, mockedTypes);
      cr.accept(modifier, false);
      byte[] modifiedClass = modifier.toByteArray();

      ClassDefinition classDefinition = new ClassDefinition(testedClass, modifiedClass);
      RedefinitionEngine.redefineClasses(classDefinition);
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy