/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockitousage.basicapi; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.exceptions.verification.NoInteractionsWanted; import org.mockito.exceptions.verification.junit.ArgumentsAreDifferent; import org.mockitoutil.TestBase; import java.util.ArrayList; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.fail; import static org.mockito.Mockito.*; public class UsingVarargsTest extends TestBase { private interface IVarArgs { void withStringVarargs(int value, String... s); String withStringVarargsReturningString(int value, String... s); void withObjectVarargs(int value, Object... o); boolean withBooleanVarargs(int value, boolean... b); int foo(Object ... objects); } @Mock IVarArgs mock; @Test public void shouldStubStringVarargs() { when(mock.withStringVarargsReturningString(1)).thenReturn("1"); when(mock.withStringVarargsReturningString(2, "1", "2", "3")).thenReturn("2"); RuntimeException expected = new RuntimeException(); doThrow(expected).when(mock).withStringVarargs(3, "1", "2", "3", "4"); assertEquals("1", mock.withStringVarargsReturningString(1)); assertEquals(null, mock.withStringVarargsReturningString(2)); assertEquals("2", mock.withStringVarargsReturningString(2, "1", "2", "3")); assertEquals(null, mock.withStringVarargsReturningString(2, "1", "2")); assertEquals(null, mock.withStringVarargsReturningString(2, "1", "2", "3", "4")); assertEquals(null, mock.withStringVarargsReturningString(2, "1", "2", "9999")); mock.withStringVarargs(3, "1", "2", "3", "9999"); mock.withStringVarargs(9999, "1", "2", "3", "4"); try { mock.withStringVarargs(3, "1", "2", "3", "4"); fail(); } catch (Exception e) { assertEquals(expected, e); } } @Test public void shouldStubBooleanVarargs() { when(mock.withBooleanVarargs(1)).thenReturn(true); when(mock.withBooleanVarargs(1, true, false)).thenReturn(true); assertEquals(true, mock.withBooleanVarargs(1)); assertEquals(false, mock.withBooleanVarargs(9999)); assertEquals(true, mock.withBooleanVarargs(1, true, false)); assertEquals(false, mock.withBooleanVarargs(1, true, false, true)); assertEquals(false, mock.withBooleanVarargs(2, true, false)); assertEquals(false, mock.withBooleanVarargs(1, true)); assertEquals(false, mock.withBooleanVarargs(1, false, false)); } @Test public void shouldVerifyStringVarargs() { mock.withStringVarargs(1); mock.withStringVarargs(2, "1", "2", "3"); mock.withStringVarargs(3, "1", "2", "3", "4"); verify(mock).withStringVarargs(1); verify(mock).withStringVarargs(2, "1", "2", "3"); try { verify(mock).withStringVarargs(2, "1", "2", "79", "4"); fail(); } catch (ArgumentsAreDifferent e) {} } @Test public void shouldVerifyObjectVarargs() { mock.withObjectVarargs(1); mock.withObjectVarargs(2, "1", new ArrayList<Object>(), new Integer(1)); mock.withObjectVarargs(3, new Integer(1)); verify(mock).withObjectVarargs(1); verify(mock).withObjectVarargs(2, "1", new ArrayList<Object>(), new Integer(1)); try { verifyNoMoreInteractions(mock); fail(); } catch (NoInteractionsWanted e) {} } @Test public void shouldVerifyBooleanVarargs() { mock.withBooleanVarargs(1); mock.withBooleanVarargs(2, true, false, true); mock.withBooleanVarargs(3, true, true, true); verify(mock).withBooleanVarargs(1); verify(mock).withBooleanVarargs(2, true, false, true); try { verify(mock).withBooleanVarargs(3, true, true, true, true); fail(); } catch (ArgumentsAreDifferent e) {} } @Test public void shouldVerifyWithAnyObject() { Foo foo = Mockito.mock(Foo.class); foo.varArgs(""); Mockito.verify(foo).varArgs((String[]) Mockito.anyObject()); Mockito.verify(foo).varArgs((String) Mockito.anyObject()); } @Test public void shouldVerifyWithNullVarArgArray() { Foo foo = Mockito.mock(Foo.class); foo.varArgs((String[]) null); Mockito.verify(foo).varArgs((String[]) Mockito.anyObject()); Mockito.verify(foo).varArgs((String[]) null); } public class Foo { public void varArgs(String... args) {} } interface MixedVarargs { String doSomething(String one, String... varargs); String doSomething(String one, String two, String... varargs); } @SuppressWarnings("all") @Test //See bug #31 public void shouldStubCorrectlyWhenMixedVarargsUsed() { MixedVarargs mixedVarargs = mock(MixedVarargs.class); when(mixedVarargs.doSomething("hello", (String[])null)).thenReturn("hello"); when(mixedVarargs.doSomething("goodbye", (String[])null)).thenReturn("goodbye"); String result = mixedVarargs.doSomething("hello",(String[]) null); assertEquals("hello", result); verify(mixedVarargs).doSomething("hello", (String[])null); } @SuppressWarnings("all") @Test public void shouldStubCorrectlyWhenDoubleStringAndMixedVarargsUsed() { MixedVarargs mixedVarargs = mock(MixedVarargs.class); when(mixedVarargs.doSomething("one", "two", (String[])null)).thenReturn("hello"); when(mixedVarargs.doSomething("1", "2", (String[])null)).thenReturn("goodbye"); String result = mixedVarargs.doSomething("one", "two", (String[])null); assertEquals("hello", result); } @Test //See bug #157 public void shouldMatchEasilyEmptyVararg() throws Exception { //when when(mock.foo(anyVararg())).thenReturn(-1); //then assertEquals(-1, mock.foo()); } }