| /* |
| * 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 org.junit.Assert.assertEquals; |
| import static org.junit.Assert.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()); |
| } |
| } |