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