1 /*
2  * Copyright (c) 2017 Mockito contributors
3  * This program is made available under the terms of the MIT License.
4  */
5 package org.mockitousage.matchers;
6 
7 import static org.junit.Assert.fail;
8 import static org.mockito.ArgumentMatchers.any;
9 import static org.mockito.ArgumentMatchers.eq;
10 import static org.mockito.ArgumentMatchers.isNotNull;
11 import static org.mockito.ArgumentMatchers.isNull;
12 import static org.mockito.Mockito.verify;
13 import static org.mockito.Mockito.when;
14 
15 import org.assertj.core.api.AbstractListAssert;
16 import org.assertj.core.api.Assertions;
17 import org.assertj.core.api.Condition;
18 import org.assertj.core.api.ObjectAssert;
19 import org.junit.Ignore;
20 import org.junit.Rule;
21 import org.junit.Test;
22 import org.junit.rules.ExpectedException;
23 import org.mockito.ArgumentCaptor;
24 import org.mockito.Captor;
25 import org.mockito.Mock;
26 import org.mockito.exceptions.verification.junit.ArgumentsAreDifferent;
27 import org.mockito.junit.MockitoJUnit;
28 import org.mockito.junit.MockitoRule;
29 import org.mockitousage.IMethods;
30 
31 public class VarargsTest {
32 
33     @Rule
34     public MockitoRule mockitoRule = MockitoJUnit.rule();
35     @Rule
36     public ExpectedException exception = ExpectedException.none();
37     @Captor
38     private ArgumentCaptor<String> captor;
39     @Mock
40     private IMethods mock;
41 
42     private static final Condition<Object> NULL = new Condition<Object>() {
43 
44         @Override
45         public boolean matches(Object value) {
46             return value == null;
47         }
48     };
49 
50     @Test
shouldMatchVarArgs_noArgs()51     public void shouldMatchVarArgs_noArgs() {
52         mock.varargs();
53 
54         verify(mock).varargs();
55     }
56 
57     @Test
58     @Ignore("This test must succeed but is fails currently, see github issue #616")
shouldMatchEmptyVarArgs_noArgsIsNotNull()59     public void shouldMatchEmptyVarArgs_noArgsIsNotNull() {
60         mock.varargs();
61 
62         verify(mock).varargs(isNotNull());
63     }
64 
65     @Test
66     @Ignore("This test must succeed but is fails currently, see github issue #616")
shouldMatchEmptyVarArgs_noArgsIsNull()67     public void shouldMatchEmptyVarArgs_noArgsIsNull() {
68         mock.varargs();
69 
70         verify(mock).varargs(isNull());
71     }
72 
73     @Test
74     @Ignore("This test must succeed but is fails currently, see github issue #616")
shouldMatchEmptyVarArgs_noArgsIsNotNullArray()75     public void shouldMatchEmptyVarArgs_noArgsIsNotNullArray() {
76         mock.varargs();
77 
78         verify(mock).varargs((String[]) isNotNull());
79     }
80 
81     @Test
shouldMatchVarArgs_oneNullArg_eqNull()82     public void shouldMatchVarArgs_oneNullArg_eqNull() {
83         Object arg = null;
84         mock.varargs(arg);
85 
86         verify(mock).varargs(eq(null));
87     }
88 
89     @Test
shouldMatchVarArgs_oneNullArg_isNull()90     public void shouldMatchVarArgs_oneNullArg_isNull() {
91         Object arg = null;
92         mock.varargs(arg);
93 
94         verify(mock).varargs(isNull());
95     }
96 
97     @Test
shouldMatchVarArgs_nullArrayArg()98     public void shouldMatchVarArgs_nullArrayArg() {
99         Object[] argArray = null;
100         mock.varargs(argArray);
101 
102         verify(mock).varargs(isNull());
103     }
104 
105     @Test
shouldnotMatchVarArgs_twoArgsOneMatcher()106     public void shouldnotMatchVarArgs_twoArgsOneMatcher() {
107         mock.varargs("1", "1");
108 
109         exception.expectMessage("Argument(s) are different");
110 
111         verify(mock).varargs(eq("1"));
112     }
113 
114     @Test
shouldMatchVarArgs_emptyVarArgsOneAnyMatcher()115     public void shouldMatchVarArgs_emptyVarArgsOneAnyMatcher() {
116         mock.varargs();
117 
118         verify(mock).varargs((String[])any()); // any() -> VarargMatcher
119     }
120 
121     @Test
shouldMatchVarArgs_oneArgsOneAnyMatcher()122     public void shouldMatchVarArgs_oneArgsOneAnyMatcher() {
123         mock.varargs(1);
124 
125         verify(mock).varargs(any()); // any() -> VarargMatcher
126     }
127 
128     @Test
shouldMatchVarArgs_twoArgsOneAnyMatcher()129     public void shouldMatchVarArgs_twoArgsOneAnyMatcher() {
130         mock.varargs(1, 2);
131 
132         verify(mock).varargs(any()); // any() -> VarargMatcher
133     }
134 
135     @Test
shouldMatchVarArgs_twoArgsTwoAnyMatcher()136     public void shouldMatchVarArgs_twoArgsTwoAnyMatcher() {
137         mock.varargs(1, 2);
138 
139         verify(mock).varargs(any(), any()); // any() -> VarargMatcher
140     }
141 
142     @Test
shouldMatchVarArgs_twoArgsThreeAnyMatcher()143     public void shouldMatchVarArgs_twoArgsThreeAnyMatcher() {
144         mock.varargs(1, 2);
145 
146         exception.expectMessage("Argument(s) are different");
147 
148         verify(mock).varargs(any(), any(), any()); //any() -> VarargMatcher
149     }
150 
151     @Test
shouldMatchVarArgs_oneNullArgument()152     public void shouldMatchVarArgs_oneNullArgument() {
153         mock.varargs("1", null);
154 
155         verify(mock).varargs(eq("1"), (String) isNull());
156     }
157 
158     @Test
shouldMatchVarArgs_onebyte()159     public void shouldMatchVarArgs_onebyte() {
160         mock.varargsbyte((byte) 1);
161 
162         verify(mock).varargsbyte(eq((byte) 1));
163     }
164 
165     @Test
shouldMatchVarArgs_nullByteArray()166     public void shouldMatchVarArgs_nullByteArray() {
167         mock.varargsbyte(null);
168 
169         verify(mock).varargsbyte((byte[]) isNull());
170     }
171 
172     @Test
shouldMatchVarArgs_emptyByteArray()173     public void shouldMatchVarArgs_emptyByteArray() {
174         mock.varargsbyte();
175 
176         verify(mock).varargsbyte();
177     }
178 
179     @Test
180     @Ignore
shouldMatchEmptyVarArgs_emptyArrayIsNotNull()181     public void shouldMatchEmptyVarArgs_emptyArrayIsNotNull() {
182         mock.varargsbyte();
183 
184         verify(mock).varargsbyte((byte[]) isNotNull());
185     }
186 
187     @Test
shouldMatchVarArgs_oneArgIsNotNull()188     public void shouldMatchVarArgs_oneArgIsNotNull() {
189         mock.varargsbyte((byte) 1);
190 
191         verify(mock).varargsbyte((byte[]) isNotNull());
192     }
193 
194     @Test
shouldCaptureVarArgs_noArgs()195     public void shouldCaptureVarArgs_noArgs() {
196         mock.varargs();
197 
198         verify(mock).varargs(captor.capture());
199 
200         assertThat(captor).isEmpty();
201     }
202 
203     @Test
shouldCaptureVarArgs_oneNullArg_eqNull()204     public void shouldCaptureVarArgs_oneNullArg_eqNull() {
205         String arg = null;
206         mock.varargs(arg);
207 
208         verify(mock).varargs(captor.capture());
209 
210         assertThat(captor).areExactly(1, NULL);
211     }
212 
213     /**
214      * Relates to Github issue #583 "ArgumentCaptor: NPE when an null array is
215      * passed to a varargs method"
216      */
217     @Test
shouldCaptureVarArgs_nullArrayArg()218     public void shouldCaptureVarArgs_nullArrayArg() {
219         String[] argArray = null;
220         mock.varargs(argArray);
221 
222         verify(mock).varargs(captor.capture());
223         assertThat(captor).areExactly(1, NULL);
224     }
225 
226     @Test
shouldCaptureVarArgs_twoArgsOneCapture()227     public void shouldCaptureVarArgs_twoArgsOneCapture() {
228         mock.varargs("1", "2");
229 
230         verify(mock).varargs(captor.capture());
231 
232         assertThat(captor).contains("1", "2");
233     }
234 
235     @Test
shouldCaptureVarArgs_twoArgsTwoCaptures()236     public void shouldCaptureVarArgs_twoArgsTwoCaptures() {
237         mock.varargs("1", "2");
238 
239         verify(mock).varargs(captor.capture(), captor.capture());
240 
241         assertThat(captor).contains("1", "2");
242     }
243 
244     @Test
shouldCaptureVarArgs_oneNullArgument()245     public void shouldCaptureVarArgs_oneNullArgument() {
246         mock.varargs("1", null);
247 
248         verify(mock).varargs(captor.capture());
249 
250         assertThat(captor).contains("1", (String) null);
251     }
252 
253     @Test
shouldCaptureVarArgs_oneNullArgument2()254     public void shouldCaptureVarArgs_oneNullArgument2() {
255         mock.varargs("1", null);
256 
257         verify(mock).varargs(captor.capture(), captor.capture());
258 
259         assertThat(captor).contains("1", (String) null);
260     }
261 
262     @Test
shouldNotCaptureVarArgs_3args2captures()263     public void shouldNotCaptureVarArgs_3args2captures() {
264         mock.varargs("1", "2", "3");
265 
266         exception.expect(ArgumentsAreDifferent.class);
267 
268         verify(mock).varargs(captor.capture(), captor.capture());
269 
270     }
271 
272     @Test
shouldCaptureVarArgs_3argsCaptorMatcherMix()273     public void shouldCaptureVarArgs_3argsCaptorMatcherMix() {
274         mock.varargs("1", "2", "3");
275 
276         verify(mock).varargs(captor.capture(), eq("2"), captor.capture());
277 
278         assertThat(captor).containsExactly("1", "3");
279 
280     }
281 
282     @Test
shouldNotCaptureVarArgs_3argsCaptorMatcherMix()283     public void shouldNotCaptureVarArgs_3argsCaptorMatcherMix() {
284         mock.varargs("1", "2", "3");
285 
286         try {
287             verify(mock).varargs(captor.capture(), eq("X"), captor.capture());
288             fail("The verification must fail, cause the second arg was not 'X' as expected!");
289         } catch (ArgumentsAreDifferent expected) {
290         }
291 
292         assertThat(captor).isEmpty();
293 
294     }
295 
296     @Test
shouldNotCaptureVarArgs_1args2captures()297     public void shouldNotCaptureVarArgs_1args2captures() {
298         mock.varargs("1");
299 
300         exception.expect(ArgumentsAreDifferent.class);
301 
302         verify(mock).varargs(captor.capture(), captor.capture());
303 
304     }
305 
306     /**
307      * As of v2.0.0-beta.118 this test fails. Once the github issues:
308      * <ul>
309      * <li>'#584 ArgumentCaptor can't capture varargs-arrays
310      * <li>#565 ArgumentCaptor should be type aware' are fixed this test must
311      * succeed
312      * </ul>
313      */
314     @Test
315     @Ignore("Blocked by github issue: #584 & #565")
shouldCaptureVarArgsAsArray()316     public void shouldCaptureVarArgsAsArray() {
317         mock.varargs("1", "2");
318 
319         ArgumentCaptor<String[]> varargCaptor = ArgumentCaptor.forClass(String[].class);
320 
321         verify(mock).varargs(varargCaptor.capture());
322 
323         assertThat(varargCaptor).containsExactly(new String[] { "1", "2" });
324     }
325 
326     @Test
shouldNotMatchRegualrAndVaraArgs()327     public void shouldNotMatchRegualrAndVaraArgs()   {
328         mock.varargsString(1, "a","b");
329 
330         exception.expect(ArgumentsAreDifferent.class);
331 
332         verify(mock).varargsString(1);
333     }
334     @Test
shouldNotMatchVaraArgs()335     public void shouldNotMatchVaraArgs()   {
336         when(mock.varargsObject(1, "a","b")).thenReturn("OK");
337 
338         Assertions.assertThat(mock.varargsObject(1)).isNull();
339     }
340 
assertThat(ArgumentCaptor<T> captor)341     private static <T> AbstractListAssert<?, ?, T, ObjectAssert<T>> assertThat(ArgumentCaptor<T> captor) {
342         return Assertions.assertThat(captor.getAllValues());
343     }
344 }
345