Class ByteBuddyCrossClassLoaderSerializationSupport.MockitoMockObjectInputStream
- java.lang.Object
-
- java.io.InputStream
-
- java.io.ObjectInputStream
-
- org.mockito.internal.creation.bytebuddy.ByteBuddyCrossClassLoaderSerializationSupport.MockitoMockObjectInputStream
-
- All Implemented Interfaces:
java.io.Closeable
,java.io.DataInput
,java.io.ObjectInput
,java.io.ObjectStreamConstants
,java.lang.AutoCloseable
- Enclosing class:
- ByteBuddyCrossClassLoaderSerializationSupport
public static class ByteBuddyCrossClassLoaderSerializationSupport.MockitoMockObjectInputStream extends java.io.ObjectInputStream
Special Mockito awareObjectInputStream
that will resolve the Mockito proxy class.This specifically crafted ObjectInoutStream has the most important role to resolve the Mockito generated class. It is doing so via the
resolveClass(ObjectStreamClass)
which looks in the stream for a Mockito marker. If this marker is found it will try to resolve the mockito class otherwise it delegates class resolution to the default super behavior. The mirror method used for serializing the mock isByteBuddyCrossClassLoaderSerializationSupport.MockitoMockObjectOutputStream.annotateClass(Class)
.When this marker is found,
ByteBuddyMockMaker.createMockType(MockCreationSettings)
methods are being used to create the mock class.
-
-
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 thename
field of the givenObjectStreamClass
with thenewProxyClass
.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
-
-
-
-
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
andextraInterfaces
to create the Mockito proxy class as theObjectStreamClass
doesn't carry useful information for this purpose.- Overrides:
resolveClass
in classjava.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 thename
field of the givenObjectStreamClass
with thenewProxyClass
. 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, ajava.io.InvalidObjectException
is thrown, so this part of the code is hacking through the givenObjectStreamClass
to change the name with the newly created class.- Parameters:
descInstance
- TheObjectStreamClass
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.
-
-