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