Home | History | Annotate | Download | only in basicapi
      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 {
     24         void withStringVarargs(int value, String... s);
     25         String withStringVarargsReturningString(int value, String... s);
     26         void withObjectVarargs(int value, Object... o);
     27         boolean withBooleanVarargs(int value, boolean... b);
     28         int foo(Object ... objects);
     29     }
     30 
     31     @Mock IVarArgs mock;
     32 
     33     @Test
     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
     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
     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
     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
    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
    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
    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 {
    134         public void varArgs(String... args) {}
    135     }
    136 
    137     interface MixedVarargs {
    138         String doSomething(String one, String... varargs);
    139         String doSomething(String one, String two, String... varargs);
    140     }
    141 
    142     @SuppressWarnings("all")
    143     @Test
    144     //See bug #31
    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
    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
    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