Home | History | Annotate | Download | only in basicapi
      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.basicapi;
      7 
      8 import org.assertj.core.api.Assertions;
      9 import org.junit.Test;
     10 import org.mockito.InOrder;
     11 import org.mockito.Mock;
     12 import org.mockito.MockitoAnnotations;
     13 import org.mockito.internal.matchers.Any;
     14 import org.mockito.internal.stubbing.answers.ThrowsException;
     15 import org.mockito.invocation.InvocationOnMock;
     16 import org.mockito.stubbing.Answer;
     17 import org.mockitousage.IMethods;
     18 import org.mockitoutil.TestBase;
     19 
     20 import java.io.ByteArrayOutputStream;
     21 import java.io.Serializable;
     22 import java.util.ArrayList;
     23 import java.util.Collections;
     24 import java.util.List;
     25 import java.util.Observable;
     26 
     27 import static junit.framework.TestCase.*;
     28 import static org.mockito.Mockito.*;
     29 import static org.mockitoutil.SimpleSerializationUtil.*;
     30 
     31 @SuppressWarnings({"unchecked", "serial"})
     32 public class MocksSerializationForAnnotationTest extends TestBase implements Serializable {
     33 
     34     private static final long serialVersionUID = 6160482220413048624L;
     35 
     36     @Mock Any any;
     37     @Mock(serializable=true) Bar barMock;
     38     @Mock(serializable=true) IMethods imethodsMock;
     39     @Mock(serializable=true) IMethods imethodsMock2;
     40     @Mock(serializable=true) Any anyMock;
     41     @Mock(serializable=true) AlreadySerializable alreadySerializableMock;
     42     @Mock(extraInterfaces={List.class},serializable=true) IMethods imethodsWithExtraInterfacesMock;
     43 
     44     @Test
     45     public void should_allow_throws_exception_to_be_serializable() throws Exception {
     46         // given
     47         when(barMock.doSomething()).thenAnswer(new ThrowsException(new RuntimeException()));
     48 
     49         //when-serialize then-deserialize
     50         serializeAndBack(barMock);
     51     }
     52 
     53     @Test
     54     public void should_allow_mock_to_be_serializable() throws Exception {
     55         // when-serialize then-deserialize
     56         serializeAndBack(imethodsMock);
     57     }
     58 
     59     @Test
     60     public void should_allow_mock_and_boolean_value_to_serializable() throws Exception {
     61         // given
     62         when(imethodsMock.booleanReturningMethod()).thenReturn(true);
     63 
     64         // when
     65         ByteArrayOutputStream serialized = serializeMock(imethodsMock);
     66 
     67         // then
     68         IMethods readObject = deserializeMock(serialized, IMethods.class);
     69         assertTrue(readObject.booleanReturningMethod());
     70     }
     71 
     72     @Test
     73     public void should_allow_mock_and_string_value_to_be_serializable() throws Exception {
     74         // given
     75         String value = "value";
     76         when(imethodsMock.stringReturningMethod()).thenReturn(value);
     77 
     78         // when
     79         ByteArrayOutputStream serialized = serializeMock(imethodsMock);
     80 
     81         // then
     82         IMethods readObject = deserializeMock(serialized, IMethods.class);
     83         assertEquals(value, readObject.stringReturningMethod());
     84     }
     85 
     86     @Test
     87     public void should_all_mock_and_serializable_value_to_be_serialized() throws Exception {
     88         // given
     89         List<?> value = Collections.emptyList();
     90         when(imethodsMock.objectReturningMethodNoArgs()).thenReturn(value);
     91 
     92         // when
     93         ByteArrayOutputStream serialized = serializeMock(imethodsMock);
     94 
     95         // then
     96         IMethods readObject = deserializeMock(serialized, IMethods.class);
     97         assertEquals(value, readObject.objectReturningMethodNoArgs());
     98     }
     99 
    100     @Test
    101     public void should_serialize_method_call_with_parameters_that_are_serializable() throws Exception {
    102         List<?> value = Collections.emptyList();
    103         when(imethodsMock.objectArgMethod(value)).thenReturn(value);
    104 
    105         // when
    106         ByteArrayOutputStream serialized = serializeMock(imethodsMock);
    107 
    108         // then
    109         IMethods readObject = deserializeMock(serialized, IMethods.class);
    110         assertEquals(value, readObject.objectArgMethod(value));
    111     }
    112 
    113     @Test
    114     public void should_serialize_method_calls_using_any_string_matcher() throws Exception {
    115         List<?> value = Collections.emptyList();
    116         when(imethodsMock.objectArgMethod(anyString())).thenReturn(value);
    117 
    118         // when
    119         ByteArrayOutputStream serialized = serializeMock(imethodsMock);
    120 
    121         // then
    122         IMethods readObject = deserializeMock(serialized, IMethods.class);
    123         assertEquals(value, readObject.objectArgMethod(""));
    124     }
    125 
    126     @Test
    127     public void should_verify_called_n_times_for_serialized_mock() throws Exception {
    128         List<?> value = Collections.emptyList();
    129         when(imethodsMock.objectArgMethod(anyString())).thenReturn(value);
    130         imethodsMock.objectArgMethod("");
    131 
    132         // when
    133         ByteArrayOutputStream serialized = serializeMock(imethodsMock);
    134 
    135         // then
    136         IMethods readObject = deserializeMock(serialized, IMethods.class);
    137         verify(readObject, times(1)).objectArgMethod("");
    138     }
    139 
    140     @Test
    141     public void should_verify_even_if_some_methods_called_after_serialization() throws Exception {
    142 
    143         // when
    144         imethodsMock.simpleMethod(1);
    145         ByteArrayOutputStream serialized = serializeMock(imethodsMock);
    146         IMethods readObject = deserializeMock(serialized, IMethods.class);
    147         readObject.simpleMethod(1);
    148 
    149         // then
    150         verify(readObject, times(2)).simpleMethod(1);
    151 
    152         //this test is working because it seems that java serialization mechanism replaces all instances
    153         //of serialized object in the object graph (if there are any)
    154     }
    155 
    156     class Bar implements Serializable {
    157         Foo foo;
    158 
    159         public Foo doSomething() {
    160             return foo;
    161         }
    162     }
    163 
    164     class Foo implements Serializable {
    165         Bar bar;
    166         Foo() {
    167             bar = new Bar();
    168             bar.foo = this;
    169         }
    170     }
    171 
    172     @Test
    173     public void should_serialization_work() throws Exception {
    174         //given
    175         Foo foo = new Foo();
    176         //when
    177         foo = serializeAndBack(foo);
    178         //then
    179         assertSame(foo, foo.bar.foo);
    180     }
    181 
    182     @Test
    183     public void should_stub_even_if_some_methods_called_after_serialization() throws Exception {
    184         //given
    185         // when
    186         when(imethodsMock.simpleMethod(1)).thenReturn("foo");
    187         ByteArrayOutputStream serialized = serializeMock(imethodsMock);
    188         IMethods readObject = deserializeMock(serialized, IMethods.class);
    189         when(readObject.simpleMethod(2)).thenReturn("bar");
    190 
    191         // then
    192         assertEquals("foo", readObject.simpleMethod(1));
    193         assertEquals("bar", readObject.simpleMethod(2));
    194     }
    195 
    196     @Test
    197     public void should_verify_call_order_for_serialized_mock() throws Exception {
    198         imethodsMock.arrayReturningMethod();
    199         imethodsMock2.arrayReturningMethod();
    200 
    201         // when
    202         ByteArrayOutputStream serialized = serializeMock(imethodsMock);
    203         ByteArrayOutputStream serialized2 = serializeMock(imethodsMock2);
    204 
    205         // then
    206         IMethods readObject = deserializeMock(serialized, IMethods.class);
    207         IMethods readObject2 = deserializeMock(serialized2, IMethods.class);
    208         InOrder inOrder = inOrder(readObject, readObject2);
    209         inOrder.verify(readObject).arrayReturningMethod();
    210         inOrder.verify(readObject2).arrayReturningMethod();
    211     }
    212 
    213     @Test
    214     public void should_remember_interactions_for_serialized_mock() throws Exception {
    215         List<?> value = Collections.emptyList();
    216         when(imethodsMock.objectArgMethod(anyString())).thenReturn(value);
    217         imethodsMock.objectArgMethod("happened");
    218 
    219         // when
    220         ByteArrayOutputStream serialized = serializeMock(imethodsMock);
    221 
    222         // then
    223         IMethods readObject = deserializeMock(serialized, IMethods.class);
    224         verify(readObject, never()).objectArgMethod("never happened");
    225     }
    226 
    227     @Test
    228     public void should_serialize_with_stubbing_callback() throws Exception {
    229 
    230         // given
    231         CustomAnswersMustImplementSerializableForSerializationToWork answer =
    232             new CustomAnswersMustImplementSerializableForSerializationToWork();
    233         answer.string = "return value";
    234         when(imethodsMock.objectArgMethod(anyString())).thenAnswer(answer);
    235 
    236         // when
    237         ByteArrayOutputStream serialized = serializeMock(imethodsMock);
    238 
    239         // then
    240         IMethods readObject = deserializeMock(serialized, IMethods.class);
    241         assertEquals(answer.string, readObject.objectArgMethod(""));
    242     }
    243 
    244     static class CustomAnswersMustImplementSerializableForSerializationToWork
    245         implements Answer<Object>, Serializable {
    246         private String string;
    247         public Object answer(InvocationOnMock invocation) throws Throwable {
    248             invocation.getArguments();
    249             invocation.getMock();
    250             return string;
    251         }
    252     }
    253 
    254     @Test
    255     public void should_serialize_with_real_object_spy() throws Exception {
    256         // given
    257         List<Object> list = new ArrayList<Object>();
    258         List<Object> spy = mock(ArrayList.class, withSettings()
    259                         .spiedInstance(list)
    260                         .defaultAnswer(CALLS_REAL_METHODS)
    261                         .serializable());
    262         when(spy.size()).thenReturn(100);
    263 
    264         // when
    265         ByteArrayOutputStream serialized = serializeMock(spy);
    266 
    267         // then
    268         List<?> readObject = deserializeMock(serialized, List.class);
    269         assertEquals(100, readObject.size());
    270     }
    271 
    272     @Test
    273     public void should_serialize_object_mock() throws Exception {
    274         // when
    275         ByteArrayOutputStream serialized = serializeMock(any);
    276 
    277         // then
    278         deserializeMock(serialized, Any.class);
    279     }
    280 
    281     @Test
    282     public void should_serialize_real_partial_mock() throws Exception {
    283         // given
    284         when(anyMock.matches(anyObject())).thenCallRealMethod();
    285 
    286         // when
    287         ByteArrayOutputStream serialized = serializeMock(anyMock);
    288 
    289         // then
    290         Any readObject = deserializeMock(serialized, Any.class);
    291         readObject.matches("");
    292     }
    293 
    294     class AlreadySerializable implements Serializable {}
    295 
    296     @Test
    297     public void should_serialize_already_serializable_class() throws Exception {
    298         // given
    299         when(alreadySerializableMock.toString()).thenReturn("foo");
    300 
    301         // when
    302         alreadySerializableMock = serializeAndBack(alreadySerializableMock);
    303 
    304         // then
    305         assertEquals("foo", alreadySerializableMock.toString());
    306     }
    307 
    308     @Test
    309     public void should_be_serialize_and_have_extra_interfaces() throws Exception {
    310         //then
    311         Assertions.assertThat((Object) serializeAndBack((List) imethodsWithExtraInterfacesMock))
    312                 .isInstanceOf(List.class)
    313                 .isInstanceOf(IMethods.class);
    314     }
    315 
    316 
    317 
    318     static class NotSerializableAndNoDefaultConstructor {
    319         NotSerializableAndNoDefaultConstructor(Observable o) { super(); }
    320     }
    321 
    322 
    323 
    324     static class SerializableAndNoDefaultConstructor implements Serializable {
    325         SerializableAndNoDefaultConstructor(Observable o) { super(); }
    326     }
    327 
    328     public static class TestClassThatHoldValidField {
    329         @Mock(serializable=true)
    330         SerializableAndNoDefaultConstructor serializableAndNoDefaultConstructor;
    331     }
    332 
    333     @Test
    334     public void should_be_able_to_serialize_type_that_implements_Serializable_but_but_dont_declare_a_no_arg_constructor() throws Exception {
    335         TestClassThatHoldValidField testClass = new TestClassThatHoldValidField();
    336         MockitoAnnotations.initMocks(testClass);
    337 
    338         serializeAndBack(testClass.serializableAndNoDefaultConstructor);
    339     }
    340 }
    341