• 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 package org.mockitousage.stubbing;
6 
7 import static org.assertj.core.api.Assertions.assertThat;
8 import static org.assertj.core.api.Assertions.within;
9 import static org.mockito.AdditionalAnswers.answer;
10 import static org.mockito.AdditionalAnswers.answerVoid;
11 import static org.mockito.AdditionalAnswers.returnsArgAt;
12 import static org.mockito.AdditionalAnswers.returnsFirstArg;
13 import static org.mockito.AdditionalAnswers.returnsLastArg;
14 import static org.mockito.AdditionalAnswers.returnsSecondArg;
15 import static org.mockito.AdditionalAnswers.answersWithDelay;
16 import static org.mockito.BDDMockito.any;
17 import static org.mockito.BDDMockito.anyInt;
18 import static org.mockito.BDDMockito.anyString;
19 import static org.mockito.BDDMockito.eq;
20 import static org.mockito.BDDMockito.given;
21 import static org.mockito.BDDMockito.mock;
22 import static org.mockito.BDDMockito.times;
23 import static org.mockito.BDDMockito.verify;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.mockito.Mock;
27 import org.mockito.junit.MockitoJUnitRunner;
28 import org.mockito.stubbing.Answer1;
29 import org.mockito.stubbing.Answer2;
30 import org.mockito.stubbing.Answer3;
31 import org.mockito.stubbing.Answer4;
32 import org.mockito.stubbing.Answer5;
33 import org.mockito.stubbing.VoidAnswer1;
34 import org.mockito.stubbing.VoidAnswer2;
35 import org.mockito.stubbing.VoidAnswer3;
36 import org.mockito.stubbing.VoidAnswer4;
37 import org.mockito.stubbing.VoidAnswer5;
38 import org.mockitousage.IMethods;
39 
40 import java.util.Date;
41 
42 @RunWith(MockitoJUnitRunner.class)
43 public class StubbingWithAdditionalAnswersTest {
44 
45     @Mock IMethods iMethods;
46 
47     @Test
can_return_arguments_of_invocation()48     public void can_return_arguments_of_invocation() throws Exception {
49         given(iMethods.objectArgMethod(any())).will(returnsFirstArg());
50         given(iMethods.threeArgumentMethod(eq(0), any(), anyString())).will(returnsSecondArg());
51         given(iMethods.threeArgumentMethod(eq(1), any(), anyString())).will(returnsLastArg());
52 
53         assertThat(iMethods.objectArgMethod("first")).isEqualTo("first");
54         assertThat(iMethods.threeArgumentMethod(0, "second", "whatever")).isEqualTo("second");
55         assertThat(iMethods.threeArgumentMethod(1, "whatever", "last")).isEqualTo("last");
56     }
57 
58     @Test
can_return_after_delay()59     public void can_return_after_delay() throws Exception {
60         final long sleepyTime = 500L;
61 
62         given(iMethods.objectArgMethod(any())).will(answersWithDelay(sleepyTime, returnsFirstArg()));
63 
64         final Date before = new Date();
65         assertThat(iMethods.objectArgMethod("first")).isEqualTo("first");
66         final Date after = new Date();
67 
68         final long timePassed = after.getTime() - before.getTime();
69         assertThat(timePassed).isCloseTo(sleepyTime, within(15L));
70     }
71 
72     @Test
can_return_expanded_arguments_of_invocation()73     public void can_return_expanded_arguments_of_invocation() throws Exception {
74         given(iMethods.varargsObject(eq(1), any())).will(returnsArgAt(3));
75 
76         assertThat(iMethods.varargsObject(1, "bob", "alexander", "alice", "carl")).isEqualTo("alice");
77     }
78 
79     @Test
can_return_primitives_or_wrappers()80     public void can_return_primitives_or_wrappers() throws Exception {
81         given(iMethods.toIntPrimitive(anyInt())).will(returnsFirstArg());
82         given(iMethods.toIntWrapper(anyInt())).will(returnsFirstArg());
83 
84         assertThat(iMethods.toIntPrimitive(1)).isEqualTo(1);
85         assertThat(iMethods.toIntWrapper(1)).isEqualTo(1);
86     }
87 
88     @Test
can_return_based_on_strongly_types_one_parameter_function()89     public void can_return_based_on_strongly_types_one_parameter_function() throws Exception {
90         given(iMethods.simpleMethod(anyString()))
91                 .will(answer(new Answer1<String, String>() {
92                     public String answer(String s) {
93                         return s;
94                     }
95                 }));
96 
97         assertThat(iMethods.simpleMethod("string")).isEqualTo("string");
98     }
99 
100     @Test
will_execute_a_void_based_on_strongly_typed_one_parameter_function()101     public void will_execute_a_void_based_on_strongly_typed_one_parameter_function() throws Exception {
102         final IMethods target = mock(IMethods.class);
103 
104         given(iMethods.simpleMethod(anyString()))
105                 .will(answerVoid(new VoidAnswer1<String>() {
106                     public void answer(String s) {
107                         target.simpleMethod(s);
108                     }
109                 }));
110 
111         // invoke on iMethods
112         iMethods.simpleMethod("string");
113 
114         // expect the answer to write correctly to "target"
115         verify(target, times(1)).simpleMethod("string");
116     }
117 
118     @Test
can_return_based_on_strongly_typed_two_parameter_function()119     public void can_return_based_on_strongly_typed_two_parameter_function() throws Exception {
120         given(iMethods.simpleMethod(anyString(), anyInt()))
121             .will(answer(new Answer2<String, String, Integer>() {
122                 public String answer(String s, Integer i) {
123                     return s + "-" + i;
124                 }
125             }));
126 
127         assertThat(iMethods.simpleMethod("string",1)).isEqualTo("string-1");
128     }
129 
130     @Test
will_execute_a_void_based_on_strongly_typed_two_parameter_function()131     public void will_execute_a_void_based_on_strongly_typed_two_parameter_function() throws Exception {
132         final IMethods target = mock(IMethods.class);
133 
134         given(iMethods.simpleMethod(anyString(), anyInt()))
135             .will(answerVoid(new VoidAnswer2<String, Integer>() {
136                 public void answer(String s, Integer i) {
137                     target.simpleMethod(s, i);
138                 }
139             }));
140 
141         // invoke on iMethods
142         iMethods.simpleMethod("string",1);
143 
144         // expect the answer to write correctly to "target"
145         verify(target, times(1)).simpleMethod("string", 1);
146     }
147 
148     @Test
can_return_based_on_strongly_typed_three_parameter_function()149     public void can_return_based_on_strongly_typed_three_parameter_function() throws Exception {
150         final IMethods target = mock(IMethods.class);
151         given(iMethods.threeArgumentMethodWithStrings(anyInt(), anyString(), anyString()))
152                 .will(answer(new Answer3<String, Integer, String, String>() {
153                     public String answer(Integer i, String s1, String s2) {
154                         target.threeArgumentMethodWithStrings(i, s1, s2);
155                         return "answered";
156                     }
157                 }));
158 
159         assertThat(iMethods.threeArgumentMethodWithStrings(1, "string1", "string2")).isEqualTo("answered");
160         verify(target, times(1)).threeArgumentMethodWithStrings(1, "string1", "string2");
161     }
162 
163     @Test
will_execute_a_void_based_on_strongly_typed_three_parameter_function()164     public void will_execute_a_void_based_on_strongly_typed_three_parameter_function() throws Exception {
165         final IMethods target = mock(IMethods.class);
166 
167         given(iMethods.threeArgumentMethodWithStrings(anyInt(), anyString(), anyString()))
168                 .will(answerVoid(new VoidAnswer3<Integer, String, String>() {
169                     public void answer(Integer i, String s1, String s2) {
170                         target.threeArgumentMethodWithStrings(i, s1, s2);
171                     }
172                 }));
173 
174         // invoke on iMethods
175         iMethods.threeArgumentMethodWithStrings(1, "string1", "string2");
176 
177         // expect the answer to write correctly to "target"
178         verify(target, times(1)).threeArgumentMethodWithStrings(1, "string1", "string2");
179     }
180 
181     @Test
can_return_based_on_strongly_typed_four_parameter_function()182     public void can_return_based_on_strongly_typed_four_parameter_function() throws Exception {
183         final IMethods target = mock(IMethods.class);
184         given(iMethods.fourArgumentMethod(anyInt(), anyString(), anyString(), any(boolean[].class)))
185                 .will(answer(new Answer4<String, Integer, String, String, boolean[]>() {
186                     public String answer(Integer i, String s1, String s2, boolean[] a) {
187                         target.fourArgumentMethod(i, s1, s2, a);
188                         return "answered";
189                     }
190                 }));
191 
192         boolean[] booleanArray = { true, false };
193         assertThat(iMethods.fourArgumentMethod(1, "string1", "string2", booleanArray)).isEqualTo("answered");
194         verify(target, times(1)).fourArgumentMethod(1, "string1", "string2", booleanArray);
195     }
196 
197     @Test
will_execute_a_void_based_on_strongly_typed_four_parameter_function()198     public void will_execute_a_void_based_on_strongly_typed_four_parameter_function() throws Exception {
199         final IMethods target = mock(IMethods.class);
200 
201         given(iMethods.fourArgumentMethod(anyInt(), anyString(), anyString(), any(boolean[].class)))
202                 .will(answerVoid(new VoidAnswer4<Integer, String, String, boolean[]>() {
203                     public void answer(Integer i, String s1, String s2, boolean[] a) {
204                         target.fourArgumentMethod(i, s1, s2, a);
205                     }
206                 }));
207 
208         // invoke on iMethods
209         boolean[] booleanArray = { true, false };
210         iMethods.fourArgumentMethod(1, "string1", "string2", booleanArray);
211 
212         // expect the answer to write correctly to "target"
213         verify(target, times(1)).fourArgumentMethod(1, "string1", "string2", booleanArray);
214     }
215 
216     @Test
can_return_based_on_strongly_typed_five_parameter_function()217     public void can_return_based_on_strongly_typed_five_parameter_function() throws Exception {
218         final IMethods target = mock(IMethods.class);
219         given(iMethods.simpleMethod(anyString(), anyInt(), anyInt(), anyInt(), anyInt()))
220                 .will(answer(new Answer5<String, String, Integer, Integer, Integer, Integer>() {
221                     public String answer(String s1, Integer i1, Integer i2, Integer i3, Integer i4) {
222                         target.simpleMethod(s1, i1, i2, i3, i4);
223                         return "answered";
224                     }
225                 }));
226 
227         assertThat(iMethods.simpleMethod("hello", 1, 2, 3, 4)).isEqualTo("answered");
228         verify(target, times(1)).simpleMethod("hello", 1, 2, 3, 4);
229     }
230 
231     @Test
will_execute_a_void_based_on_strongly_typed_five_parameter_function()232     public void will_execute_a_void_based_on_strongly_typed_five_parameter_function() throws Exception {
233         final IMethods target = mock(IMethods.class);
234 
235         given(iMethods.simpleMethod(anyString(), anyInt(), anyInt(), anyInt(), anyInt()))
236                 .will(answerVoid(new VoidAnswer5<String, Integer, Integer, Integer, Integer>() {
237                     public void  answer(String s1, Integer i1, Integer i2, Integer i3, Integer i4) {
238                         target.simpleMethod(s1, i1, i2, i3, i4);
239                     }
240                 }));
241 
242         // invoke on iMethods
243         iMethods.simpleMethod("hello", 1, 2, 3, 4);
244 
245         // expect the answer to write correctly to "target"
246         verify(target, times(1)).simpleMethod("hello", 1, 2, 3, 4);
247     }
248 
249 }
250