• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.mockitousage.serialization;
2 
3 import org.junit.Test;
4 
5 import java.io.Serializable;
6 import java.util.Iterator;
7 import java.util.List;
8 
9 import static org.assertj.core.api.Assertions.assertThat;
10 import static org.mockito.Mockito.*;
11 import static org.mockitoutil.SimpleSerializationUtil.serializeAndBack;
12 
13 public class DeepStubsSerializableTest {
14 
15     @Test
should_serialize_and_deserialize_mock_created_with_deep_stubs()16     public void should_serialize_and_deserialize_mock_created_with_deep_stubs() throws Exception {
17         // given
18         SampleClass sampleClass = mock(SampleClass.class, withSettings().defaultAnswer(RETURNS_DEEP_STUBS).serializable());
19         when(sampleClass.getSample().isFalse()).thenReturn(true);
20         when(sampleClass.getSample().number()).thenReturn(999);
21 
22         // when
23         SampleClass deserializedSample = serializeAndBack(sampleClass);
24 
25         // then
26         assertThat(deserializedSample.getSample().isFalse()).isEqualTo(true);
27         assertThat(deserializedSample.getSample().number()).isEqualTo(999);
28     }
29 
30     @Test
should_serialize_and_deserialize_parameterized_class_mocked_with_deep_stubs()31     public void should_serialize_and_deserialize_parameterized_class_mocked_with_deep_stubs() throws Exception {
32         // given
33         ListContainer deep_stubbed = mock(ListContainer.class, withSettings().defaultAnswer(RETURNS_DEEP_STUBS).serializable());
34         when(deep_stubbed.iterator().next().add("yes")).thenReturn(true);
35 
36         // when
37         ListContainer deserialized_deep_stub = serializeAndBack(deep_stubbed);
38 
39         // then
40         assertThat(deserialized_deep_stub.iterator().next().add("not stubbed but mock already previously resolved")).isEqualTo(false);
41         assertThat(deserialized_deep_stub.iterator().next().add("yes")).isEqualTo(true);
42     }
43 
44     @Test(expected = ClassCastException.class)
should_discard_generics_metadata_when_serialized_then_disabling_deep_stubs_with_generics()45     public void should_discard_generics_metadata_when_serialized_then_disabling_deep_stubs_with_generics() throws Exception {
46         // given
47         ListContainer deep_stubbed = mock(ListContainer.class, withSettings().defaultAnswer(RETURNS_DEEP_STUBS).serializable());
48         when(deep_stubbed.iterator().hasNext()).thenReturn(true);
49 
50         ListContainer deserialized_deep_stub = serializeAndBack(deep_stubbed);
51 
52         // when stubbing on a deserialized mock
53         when(deserialized_deep_stub.iterator().next().get(42)).thenReturn("no");
54 
55         // then revert to the default RETURNS_DEEP_STUBS and the code will raise a ClassCastException
56     }
57 
58 
59     static class SampleClass implements Serializable {
getSample()60         SampleClass2 getSample() { return new SampleClass2(); }
61     }
62 
63     static class SampleClass2 implements Serializable {
isFalse()64         boolean isFalse() { return false; }
number()65         int number() { return 100; }
66     }
67 
68     static class Container<E> implements Iterable<E>, Serializable {
69         private E e;
Container(E e)70         public Container(E e) { this.e = e; }
get()71         public E get() { return e; }
72 
iterator()73         public Iterator<E> iterator() {
74             return new Iterator<E>() {
75                 public boolean hasNext() { return true; }
76                 public E next() { return e; }
77                 public void remove() { }
78             };
79         }
80     }
81 
82     static class ListContainer extends Container<List<String>> {
83         public ListContainer(List<String> list) { super(list); }
84     }
85 }
86