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