Class ByteBuddyCrossClassLoaderSerializationSupport.MockitoMockObjectInputStream

    • Nested Class Summary

      • Nested classes/interfaces inherited from class java.io.ObjectInputStream

        java.io.ObjectInputStream.GetField
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private java.util.Set<java.lang.Class<?>> extraInterfaces  
      private java.lang.Class<?> typeToMock  
      • Fields inherited from interface java.io.ObjectStreamConstants

        baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, SERIAL_FILTER_PERMISSION, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING
    • Constructor Summary

      Constructors 
      Constructor Description
      MockitoMockObjectInputStream​(java.io.InputStream in, java.lang.Class<?> typeToMock, java.util.Set<java.lang.Class<?>> extraInterfaces)  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private void hackClassNameToMatchNewlyCreatedClass​(java.io.ObjectStreamClass descInstance, java.lang.Class<?> proxyClass)
      Hack the name field of the given ObjectStreamClass with the newProxyClass.
      private boolean notMarkedAsAMockitoMock​(java.lang.Object marker)
      Read the stream class annotation and identify it as a Mockito mock or not.
      protected java.lang.Class<?> resolveClass​(java.io.ObjectStreamClass desc)
      Resolve the Mockito proxy class if it is marked as such.
      • Methods inherited from class java.io.ObjectInputStream

        available, close, defaultReadObject, enableResolveObject, getObjectInputFilter, read, read, readBoolean, readByte, readChar, readClassDescriptor, readDouble, readFields, readFloat, readFully, readFully, readInt, readLine, readLong, readObject, readObjectOverride, readShort, readStreamHeader, readUnshared, readUnsignedByte, readUnsignedShort, readUTF, registerValidation, resolveObject, resolveProxyClass, setObjectInputFilter, skipBytes
      • Methods inherited from class java.io.InputStream

        mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, transferTo
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • Methods inherited from interface java.io.ObjectInput

        read, skip
    • Field Detail

      • typeToMock

        private final java.lang.Class<?> typeToMock
      • extraInterfaces

        private final java.util.Set<java.lang.Class<?>> extraInterfaces
    • Constructor Detail

      • MockitoMockObjectInputStream

        public MockitoMockObjectInputStream​(java.io.InputStream in,
                                            java.lang.Class<?> typeToMock,
                                            java.util.Set<java.lang.Class<?>> extraInterfaces)
                                     throws java.io.IOException
        Throws:
        java.io.IOException
    • Method Detail

      • resolveClass

        protected java.lang.Class<?> resolveClass​(java.io.ObjectStreamClass desc)
                                           throws java.io.IOException,
                                                  java.lang.ClassNotFoundException
        Resolve the Mockito proxy class if it is marked as such.

        Uses the fields typeToMock and extraInterfaces to create the Mockito proxy class as the ObjectStreamClass doesn't carry useful information for this purpose.

        Overrides:
        resolveClass in class java.io.ObjectInputStream
        Parameters:
        desc - Description of the class in the stream, not used.
        Returns:
        The class that will be used to deserialize the instance mock.
        Throws:
        java.io.IOException
        java.lang.ClassNotFoundException
      • hackClassNameToMatchNewlyCreatedClass

        private void hackClassNameToMatchNewlyCreatedClass​(java.io.ObjectStreamClass descInstance,
                                                           java.lang.Class<?> proxyClass)
                                                    throws java.io.ObjectStreamException
        Hack the name field of the given ObjectStreamClass with the newProxyClass.

        The parent ObjectInputStream will check the name of the class in the stream matches the name of the one that is created in this method.

        The CGLIB classes uses a hash of the classloader and/or maybe some other data that allow them to be relatively unique in a JVM.

        When names differ, which happens when the mock is deserialized in another ClassLoader, a java.io.InvalidObjectException is thrown, so this part of the code is hacking through the given ObjectStreamClass to change the name with the newly created class.

        Parameters:
        descInstance - The ObjectStreamClass that will be hacked.
        proxyClass - The proxy class whose name will be applied.
        Throws:
        java.io.InvalidObjectException
        java.io.ObjectStreamException
      • notMarkedAsAMockitoMock

        private boolean notMarkedAsAMockitoMock​(java.lang.Object marker)
        Read the stream class annotation and identify it as a Mockito mock or not.
        Parameters:
        marker - The marker to identify.
        Returns:
        true if not marked as a Mockito, false if the class annotation marks a Mockito mock.