1 /* 2 * Copyright (c) 2007 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 6 package org.mockitousage.basicapi; 7 8 import org.junit.Test; 9 import org.mockito.Mock; 10 import org.mockito.Mockito; 11 import org.mockito.exceptions.verification.NoInteractionsWanted; 12 import org.mockito.exceptions.verification.junit.ArgumentsAreDifferent; 13 import org.mockitoutil.TestBase; 14 15 import java.util.ArrayList; 16 17 import static org.junit.Assert.assertEquals; 18 import static org.junit.Assert.fail; 19 import static org.mockito.Mockito.*; 20 21 public class UsingVarargsTest extends TestBase { 22 23 private interface IVarArgs { withStringVarargs(int value, String... s)24 void withStringVarargs(int value, String... s); withStringVarargsReturningString(int value, String... s)25 String withStringVarargsReturningString(int value, String... s); withObjectVarargs(int value, Object... o)26 void withObjectVarargs(int value, Object... o); withBooleanVarargs(int value, boolean... b)27 boolean withBooleanVarargs(int value, boolean... b); foo(Object .... objects)28 int foo(Object ... objects); 29 } 30 31 @Mock IVarArgs mock; 32 33 @Test shouldStubStringVarargs()34 public void shouldStubStringVarargs() { 35 when(mock.withStringVarargsReturningString(1)).thenReturn("1"); 36 when(mock.withStringVarargsReturningString(2, "1", "2", "3")).thenReturn("2"); 37 38 RuntimeException expected = new RuntimeException(); 39 doThrow(expected).when(mock).withStringVarargs(3, "1", "2", "3", "4"); 40 41 assertEquals("1", mock.withStringVarargsReturningString(1)); 42 assertEquals(null, mock.withStringVarargsReturningString(2)); 43 44 assertEquals("2", mock.withStringVarargsReturningString(2, "1", "2", "3")); 45 assertEquals(null, mock.withStringVarargsReturningString(2, "1", "2")); 46 assertEquals(null, mock.withStringVarargsReturningString(2, "1", "2", "3", "4")); 47 assertEquals(null, mock.withStringVarargsReturningString(2, "1", "2", "9999")); 48 49 mock.withStringVarargs(3, "1", "2", "3", "9999"); 50 mock.withStringVarargs(9999, "1", "2", "3", "4"); 51 52 try { 53 mock.withStringVarargs(3, "1", "2", "3", "4"); 54 fail(); 55 } catch (Exception e) { 56 assertEquals(expected, e); 57 } 58 } 59 60 @Test shouldStubBooleanVarargs()61 public void shouldStubBooleanVarargs() { 62 when(mock.withBooleanVarargs(1)).thenReturn(true); 63 when(mock.withBooleanVarargs(1, true, false)).thenReturn(true); 64 65 assertEquals(true, mock.withBooleanVarargs(1)); 66 assertEquals(false, mock.withBooleanVarargs(9999)); 67 68 assertEquals(true, mock.withBooleanVarargs(1, true, false)); 69 assertEquals(false, mock.withBooleanVarargs(1, true, false, true)); 70 assertEquals(false, mock.withBooleanVarargs(2, true, false)); 71 assertEquals(false, mock.withBooleanVarargs(1, true)); 72 assertEquals(false, mock.withBooleanVarargs(1, false, false)); 73 } 74 75 @Test shouldVerifyStringVarargs()76 public void shouldVerifyStringVarargs() { 77 mock.withStringVarargs(1); 78 mock.withStringVarargs(2, "1", "2", "3"); 79 mock.withStringVarargs(3, "1", "2", "3", "4"); 80 81 verify(mock).withStringVarargs(1); 82 verify(mock).withStringVarargs(2, "1", "2", "3"); 83 try { 84 verify(mock).withStringVarargs(2, "1", "2", "79", "4"); 85 fail(); 86 } catch (ArgumentsAreDifferent e) {} 87 } 88 89 @Test shouldVerifyObjectVarargs()90 public void shouldVerifyObjectVarargs() { 91 mock.withObjectVarargs(1); 92 mock.withObjectVarargs(2, "1", new ArrayList<Object>(), new Integer(1)); 93 mock.withObjectVarargs(3, new Integer(1)); 94 95 verify(mock).withObjectVarargs(1); 96 verify(mock).withObjectVarargs(2, "1", new ArrayList<Object>(), new Integer(1)); 97 try { 98 verifyNoMoreInteractions(mock); 99 fail(); 100 } catch (NoInteractionsWanted e) {} 101 } 102 103 @Test shouldVerifyBooleanVarargs()104 public void shouldVerifyBooleanVarargs() { 105 mock.withBooleanVarargs(1); 106 mock.withBooleanVarargs(2, true, false, true); 107 mock.withBooleanVarargs(3, true, true, true); 108 109 verify(mock).withBooleanVarargs(1); 110 verify(mock).withBooleanVarargs(2, true, false, true); 111 try { 112 verify(mock).withBooleanVarargs(3, true, true, true, true); 113 fail(); 114 } catch (ArgumentsAreDifferent e) {} 115 } 116 117 @Test shouldVerifyWithAnyObject()118 public void shouldVerifyWithAnyObject() { 119 Foo foo = Mockito.mock(Foo.class); 120 foo.varArgs(""); 121 Mockito.verify(foo).varArgs((String[]) Mockito.anyObject()); 122 Mockito.verify(foo).varArgs((String) Mockito.anyObject()); 123 } 124 125 @Test shouldVerifyWithNullVarArgArray()126 public void shouldVerifyWithNullVarArgArray() { 127 Foo foo = Mockito.mock(Foo.class); 128 foo.varArgs((String[]) null); 129 Mockito.verify(foo).varArgs((String[]) Mockito.anyObject()); 130 Mockito.verify(foo).varArgs((String[]) null); 131 } 132 133 public class Foo { varArgs(String... args)134 public void varArgs(String... args) {} 135 } 136 137 interface MixedVarargs { doSomething(String one, String... varargs)138 String doSomething(String one, String... varargs); doSomething(String one, String two, String... varargs)139 String doSomething(String one, String two, String... varargs); 140 } 141 142 @SuppressWarnings("all") 143 @Test 144 //See bug #31 shouldStubCorrectlyWhenMixedVarargsUsed()145 public void shouldStubCorrectlyWhenMixedVarargsUsed() { 146 MixedVarargs mixedVarargs = mock(MixedVarargs.class); 147 when(mixedVarargs.doSomething("hello", (String[])null)).thenReturn("hello"); 148 when(mixedVarargs.doSomething("goodbye", (String[])null)).thenReturn("goodbye"); 149 150 String result = mixedVarargs.doSomething("hello",(String[]) null); 151 assertEquals("hello", result); 152 153 verify(mixedVarargs).doSomething("hello", (String[])null); 154 } 155 156 @SuppressWarnings("all") 157 @Test shouldStubCorrectlyWhenDoubleStringAndMixedVarargsUsed()158 public void shouldStubCorrectlyWhenDoubleStringAndMixedVarargsUsed() { 159 MixedVarargs mixedVarargs = mock(MixedVarargs.class); 160 when(mixedVarargs.doSomething("one", "two", (String[])null)).thenReturn("hello"); 161 when(mixedVarargs.doSomething("1", "2", (String[])null)).thenReturn("goodbye"); 162 163 String result = mixedVarargs.doSomething("one", "two", (String[])null); 164 assertEquals("hello", result); 165 } 166 167 @Test 168 //See bug #157 shouldMatchEasilyEmptyVararg()169 public void shouldMatchEasilyEmptyVararg() throws Exception { 170 //when 171 when(mock.foo(anyVararg())).thenReturn(-1); 172 173 //then 174 assertEquals(-1, mock.foo()); 175 } 176 } 177