Class TestClassTransformer

java.lang.Object
org.powermock.core.transformers.impl.TestClassTransformer
All Implemented Interfaces:
MockTransformer

public abstract class TestClassTransformer extends Object implements MockTransformer
MockTransformer implementation that will make PowerMock test-class enhancements for four purposes... 1) Make test-class static initializer and constructor send crucial details (for PowerMockTestListener events) to GlobalNotificationBuildSupport so that this information can be forwarded to whichever facility is used for composing the PowerMockTestListener events. 2) Removal of test-method annotations as a mean to achieve test-suite chunking! 3) Restore original test-class constructors` accesses (in case they have all been made public by AbstractMainMockTransformer.setAllConstructorsToPublic(javassist.CtClass)) - to avoid that multiple public test-class constructors cause a delegate runner from JUnit (or 3rd party) to bail out with an error message such as "Test class can only have one constructor". 4) Set test-class defer constructor (if exist) as protected instead of public. Otherwise a delegate runner from JUnit (or 3rd party) might get confused by the presence of more than one test-class constructor and bail out with an error message such as "Test class can only have one constructor". The #3 and #4 enhancements will also be enforced on the constructors of classes that are nested within the test-class.
  • Field Details

    • testClass

      private final Class<?> testClass
    • testMethodAnnotationType

      private final Class<? extends Annotation> testMethodAnnotationType
  • Constructor Details

    • TestClassTransformer

      private TestClassTransformer(Class<?> testClass, Class<? extends Annotation> testMethodAnnotationType)
  • Method Details

    • forTestClass

      public static TestClassTransformer.ForTestClass forTestClass(Class<?> testClass)
    • isTestClass

      private boolean isTestClass(javassist.CtClass clazz)
    • isNestedWithinTestClass

      private boolean isNestedWithinTestClass(javassist.CtClass clazz)
    • asOriginalClass

      private Class<?> asOriginalClass(javassist.CtClass type) throws Exception
      Throws:
      Exception
    • asOriginalClassParams

      private Class<?>[] asOriginalClassParams(javassist.CtClass[] parameterTypes) throws Exception
      Throws:
      Exception
    • mustHaveTestAnnotationRemoved

      abstract boolean mustHaveTestAnnotationRemoved(javassist.CtMethod method) throws Exception
      Throws:
      Exception
    • removeTestMethodAnnotationFrom

      private void removeTestMethodAnnotationFrom(javassist.CtMethod m) throws ClassNotFoundException
      Throws:
      ClassNotFoundException
    • removeTestAnnotationsForTestMethodsThatRunOnOtherClassLoader

      private void removeTestAnnotationsForTestMethodsThatRunOnOtherClassLoader(javassist.CtClass clazz) throws Exception
      Throws:
      Exception
    • transform

      public javassist.CtClass transform(javassist.CtClass clazz) throws Exception
      Description copied from interface: MockTransformer
      Transforms the clazz.
      Specified by:
      transform in interface MockTransformer
      Parameters:
      clazz - The class to be transform into a mock enabled class.
      Returns:
      A CtClass representation of the mocked class.
      Throws:
      Exception
    • addLifeCycleNotifications

      private void addLifeCycleNotifications(javassist.CtClass clazz)
    • addClassInitializerNotification

      private void addClassInitializerNotification(javassist.CtClass clazz) throws javassist.CannotCompileException
      Throws:
      javassist.CannotCompileException
    • hasSuperClass

      private static boolean hasSuperClass(javassist.CtClass clazz)
    • addConstructorNotification

      private void addConstructorNotification(javassist.CtClass clazz) throws javassist.CannotCompileException
      Throws:
      javassist.CannotCompileException
    • restoreOriginalConstructorsAccesses

      private void restoreOriginalConstructorsAccesses(javassist.CtClass clazz) throws Exception
      Throws:
      Exception
    • makeDeferConstructorNonPublic

      private void makeDeferConstructorNonPublic(javassist.CtClass clazz)
    • signatureOf

      private static String signatureOf(Method m)
    • signatureOf

      private static String signatureOf(javassist.CtMethod m) throws javassist.NotFoundException
      Throws:
      javassist.NotFoundException
    • createSignature

      private static String createSignature(String testClass, String returnType, String methodName, String[] paramTypes)