1 /* 2 * Copyright (c) 2007 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 6 package org.mockitousage.serialization; 7 8 import org.junit.Before; 9 import org.junit.Test; 10 import org.mockito.Mockito; 11 import org.mockito.mock.SerializableMode; 12 import org.mockitousage.IMethods; 13 import org.mockitoutil.SimplePerRealmReloadingClassLoader; 14 import org.mockitoutil.SimpleSerializationUtil; 15 16 import java.io.ByteArrayInputStream; 17 import java.util.Collections; 18 import java.util.List; 19 import java.util.concurrent.Callable; 20 21 22 public class AcrossClassLoaderSerializationTest { 23 24 public IMethods mock; 25 26 @Before reproduce_CCE_by_creating_a_mock_with_IMethods_before()27 public void reproduce_CCE_by_creating_a_mock_with_IMethods_before() throws Exception { 28 mock = Mockito.mock(IMethods.class); 29 } 30 31 @Test check_that_mock_can_be_serialized_in_a_classloader_and_deserialized_in_another()32 public void check_that_mock_can_be_serialized_in_a_classloader_and_deserialized_in_another() throws Exception { 33 byte[] bytes = create_mock_and_serialize_it_in_class_loader_A(); 34 35 Object the_deserialized_mock = read_stream_and_deserialize_it_in_class_loader_B(bytes); 36 } 37 read_stream_and_deserialize_it_in_class_loader_B(byte[] bytes)38 private Object read_stream_and_deserialize_it_in_class_loader_B(byte[] bytes) throws Exception { 39 return new SimplePerRealmReloadingClassLoader(this.getClass().getClassLoader(), isolating_test_classes()) 40 .doInRealm( 41 "org.mockitousage.serialization.AcrossClassLoaderSerializationTest$ReadStreamAndDeserializeIt", 42 new Class<?>[]{ byte[].class }, 43 new Object[]{ bytes } 44 ); 45 } 46 create_mock_and_serialize_it_in_class_loader_A()47 private byte[] create_mock_and_serialize_it_in_class_loader_A() throws Exception { 48 return (byte[]) new SimplePerRealmReloadingClassLoader(this.getClass().getClassLoader(), isolating_test_classes()) 49 .doInRealm("org.mockitousage.serialization.AcrossClassLoaderSerializationTest$CreateMockAndSerializeIt"); 50 } 51 52 isolating_test_classes()53 private SimplePerRealmReloadingClassLoader.ReloadClassPredicate isolating_test_classes() { 54 return new SimplePerRealmReloadingClassLoader.ReloadClassPredicate() { 55 public boolean acceptReloadOf(String qualifiedName) { 56 return qualifiedName.contains("org.mockitousage") 57 || qualifiedName.contains("org.mockitoutil") 58 ; 59 } 60 }; 61 } 62 63 64 // see create_mock_and_serialize_it_in_class_loader_A 65 public static class CreateMockAndSerializeIt implements Callable<byte[]> { 66 public byte[] call() throws Exception { 67 AClassToBeMockedInThisTestOnlyAndInCallablesOnly mock = Mockito.mock( 68 AClassToBeMockedInThisTestOnlyAndInCallablesOnly.class, 69 Mockito.withSettings().serializable(SerializableMode.ACROSS_CLASSLOADERS) 70 ); 71 // use MethodProxy before 72 mock.returningSomething(); 73 74 return SimpleSerializationUtil.serializeMock(mock).toByteArray(); 75 } 76 } 77 78 // see read_stream_and_deserialize_it_in_class_loader_B 79 public static class ReadStreamAndDeserializeIt implements Callable<Object> { 80 private byte[] bytes; 81 82 public ReadStreamAndDeserializeIt(byte[] bytes) { 83 this.bytes = bytes; 84 } 85 86 public Object call() throws Exception { 87 ByteArrayInputStream to_unserialize = new ByteArrayInputStream(bytes); 88 return SimpleSerializationUtil.deserializeMock( 89 to_unserialize, 90 AClassToBeMockedInThisTestOnlyAndInCallablesOnly.class 91 ); 92 } 93 } 94 95 96 public static class AClassToBeMockedInThisTestOnlyAndInCallablesOnly { 97 List returningSomething() { return Collections.emptyList(); } 98 } 99 } 100