From 9d45694b88ab11aa279f62f1afdf3309d604e581 Mon Sep 17 00:00:00 2001 From: Mathieu Date: Sat, 28 Jul 2018 19:01:54 +0700 Subject: [PATCH] Fixes issue #1222 --- .../internal/matchers/VarargMatcherImpl.java | 32 ++++++++++++++ .../matchers/VarargMatcherImplTest.java | 43 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/main/java/org/mockito/internal/matchers/VarargMatcherImpl.java create mode 100644 src/test/java/org/mockito/internal/matchers/VarargMatcherImplTest.java diff --git a/src/main/java/org/mockito/internal/matchers/VarargMatcherImpl.java b/src/main/java/org/mockito/internal/matchers/VarargMatcherImpl.java new file mode 100644 index 0000000000..a7fabf33c9 --- /dev/null +++ b/src/main/java/org/mockito/internal/matchers/VarargMatcherImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2007 Mockito contributors + * This program is made available under the terms of the MIT License. + */ +package org.mockito.internal.matchers; + +import org.mockito.ArgumentMatcher; + +/** + * This class is used to verify with a vararg matcher + */ +public class VarargMatcherImpl implements VarargMatcher, ArgumentMatcher { + private T[] values; + private int iterator; + public VarargMatcherImpl(T... value) { + this.values = value; + } + + @Override + public boolean matches(T argument){ + iterator %= values.length; + return values[iterator++].equals(argument); + } + + public String toString() { + String name = values.getClass().getComponentType().getSimpleName(); + String str = "vararg<"+name+">("; + for(int i = 0 ; i < values.length; i++) + str += values[i] + (i < values.length - 1 ? ", " : ")"); + return str; + } +} diff --git a/src/test/java/org/mockito/internal/matchers/VarargMatcherImplTest.java b/src/test/java/org/mockito/internal/matchers/VarargMatcherImplTest.java new file mode 100644 index 0000000000..cf8df721f8 --- /dev/null +++ b/src/test/java/org/mockito/internal/matchers/VarargMatcherImplTest.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017 Mockito contributors + * This program is made available under the terms of the MIT License. + */ +package org.mockito.internal.matchers; + +import org.junit.Test; +import org.mockito.ArgumentMatcher; +import org.mockitousage.IMethods; +import org.mockitoutil.TestBase; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.*; + +/** + * This test is used to use vararg matcher instead of arrays + */ +public class VarargMatcherImplTest extends TestBase { + + @Test + public void testMatcher() throws Exception { + ArgumentMatcher matcher = new VarargMatcherImpl("1", "2", "3"); + assertTrue(matcher.matches("1")); + assertTrue(matcher.matches("2")); + assertTrue(matcher.matches("3")); + } + + @Test + public void testMatcherString() throws Exception { + ArgumentMatcher matcher = new VarargMatcherImpl("1", "2", "3"); + assertTrue(matcher.toString().equals("vararg(1, 2, 3)")); + } + + @Test + public void should_verify_varargs_as_array() throws Exception { + IMethods mock = mock(IMethods.class); + mock.mixedVarargs("1", "2", "3"); + verify(mock).mixedVarargs(any(), argThat(new VarargMatcherImpl("2", "3"))); + } +}