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