All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fitbur.mockito.Matchers Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2007 Mockito contributors
 * This program is made available under the terms of the MIT License.
 */
package com.fitbur.mockito;

import com.fitbur.mockito.internal.matchers.*;
import com.fitbur.mockito.internal.matchers.apachecommons.ReflectionEquals;
import com.fitbur.mockito.internal.progress.MockingProgress;
import com.fitbur.mockito.internal.progress.ThreadSafeMockingProgress;
import com.fitbur.mockito.internal.util.Primitives;

import static com.fitbur.mockito.internal.util.Primitives.defaultValue;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Allow flexible verification or stubbing. See also {@link AdditionalMatchers}.
 * 

* {@link Mockito} extends Matchers so to get access to all matchers just import Mockito class statically. *


 *  //stubbing using anyInt() argument matcher
 *  when(mockedList.get(anyInt())).thenReturn("element");
 *  
 *  //following prints "element"
 *  System.out.println(mockedList.get(999));
 *  
 *  //you can also verify using argument matcher
 *  verify(mockedList).get(anyInt());
 * 
* Scroll down to see all methods - full list of matchers. *

* Warning: *

* If you are using argument matchers, all arguments have to be provided by matchers. *

* E.g: (example shows verification but the same applies to stubbing): *


 *   verify(mock).someMethod(anyInt(), anyString(), eq("third argument"));
 *   //above is correct - eq() is also an argument matcher
 *   
 *   verify(mock).someMethod(anyInt(), anyString(), "third argument");
 *   //above is incorrect - exception will be thrown because third argument is given without argument matcher.
 * 
*

* Matcher methods like anyObject(), eq() do not return matchers. * Internally, they record a matcher on a stack and return a dummy value (usually null). * This implementation is due static type safety imposed by java compiler. * The consequence is that you cannot use anyObject(), eq() methods outside of verified/stubbed method. * *

Custom Argument Matchers

* * It is important to understand the use cases and available options for dealing with non-trivial arguments * before implementing custom argument matchers. This way, you can select the best possible approach * for given scenario and produce highest quality test (clean and maintainable). * Please read on in the javadoc for {@link ArgumentMatcher} to learn about approaches and see the examples. */ @SuppressWarnings("unchecked") public class Matchers { private static final MockingProgress MOCKING_PROGRESS = new ThreadSafeMockingProgress(); /** * Any boolean or non-null Boolean *

* See examples in javadoc for {@link Matchers} class * * @return false. */ public static boolean anyBoolean() { reportMatcher(new InstanceOf(Boolean.class)); return false; } /** * Any byte or non-null Byte. *

* See examples in javadoc for {@link Matchers} class * * @return 0. */ public static byte anyByte() { reportMatcher(new InstanceOf(Byte.class)); return 0; } /** * Any char or non-null Character. *

* See examples in javadoc for {@link Matchers} class * * @return 0. */ public static char anyChar() { reportMatcher(new InstanceOf(Character.class)); return 0; } /** * Any int or non-null Integer. *

* See examples in javadoc for {@link Matchers} class * * @return 0. */ public static int anyInt() { reportMatcher(new InstanceOf(Integer.class)); return 0; } /** * Any long or non-null Long. *

* See examples in javadoc for {@link Matchers} class * * @return 0. */ public static long anyLong() { reportMatcher(new InstanceOf(Long.class)); return 0; } /** * Any float or non-null Float. *

* See examples in javadoc for {@link Matchers} class * * @return 0. */ public static float anyFloat() { reportMatcher(new InstanceOf(Float.class)); return 0; } /** * Any double or non-null Double. *

* See examples in javadoc for {@link Matchers} class * * @return 0. */ public static double anyDouble() { reportMatcher(new InstanceOf(Double.class)); return 0; } /** * Any short or non-null Short. *

* See examples in javadoc for {@link Matchers} class * * @return 0. */ public static short anyShort() { reportMatcher(new InstanceOf(Short.class)); return 0; } /** * Matches anything, including null. *

* This is an alias of: {@link #any()} and {@link #any(java.lang.Class)} *

* See examples in javadoc for {@link Matchers} class * * @return null. */ public static T anyObject() { reportMatcher(Any.ANY); return null; } /** * Any vararg, meaning any number and values of arguments. *

* Example: *


     *   //verification:
     *   mock.foo(1, 2);
     *   mock.foo(1, 2, 3, 4);
     *
     *   verify(mock, times(2)).foo(anyVararg());
     *
     *   //stubbing:
     *   when(mock.foo(anyVararg()).thenReturn(100);
     *
     *   //prints 100
     *   System.out.println(mock.foo(1, 2));
     *   //also prints 100
     *   System.out.println(mock.foo(1, 2, 3, 4));
     * 
* See examples in javadoc for {@link Matchers} class * * @return null. */ public static T anyVararg() { reportMatcher(AnyVararg.ANY_VARARG); return null; } /** * Matches any object, including nulls *

* This method doesn't do type checks with the given parameter, it is only there * to avoid casting in your code. This might however change (type checks could * be added) in a future major release. *

* See examples in javadoc for {@link Matchers} class *

* This is an alias of: {@link #any()} and {@link #anyObject()} *

* @return null. */ public static T any(Class clazz) { reportMatcher(Any.ANY); return defaultValue(clazz); } /** * Matches anything, including nulls *

* Shorter alias to {@link Matchers#anyObject()} *

* See examples in javadoc for {@link Matchers} class *

* This is an alias of: {@link #anyObject()} and {@link #any(java.lang.Class)} *

* @return null. */ public static T any() { return anyObject(); } /** * Any non-null String *

* See examples in javadoc for {@link Matchers} class * * @return empty String ("") */ public static String anyString() { reportMatcher(new InstanceOf(String.class)); return ""; } /** * Any non-null List. *

* See examples in javadoc for {@link Matchers} class * * @return empty List. */ public static List anyList() { reportMatcher(new InstanceOf(List.class)); return new LinkedList(); } /** * Generic friendly alias to {@link Matchers#anyList()}. * It's an alternative to @SuppressWarnings("unchecked") to keep code clean of compiler warnings. *

* Any non-null List. *

* This method doesn't do type checks with the given parameter, it is only there * to avoid casting in your code. This might however change (type checks could * be added) in a future major release. *

* See examples in javadoc for {@link Matchers} class * * @param clazz Type owned by the list to avoid casting * @return empty List. */ public static List anyListOf(Class clazz) { return anyList(); } /** * Any non-null Set. *

* See examples in javadoc for {@link Matchers} class * * @return empty Set */ public static Set anySet() { reportMatcher(new InstanceOf(Set.class)); return new HashSet(); } /** * Generic friendly alias to {@link Matchers#anySet()}. * It's an alternative to @SuppressWarnings("unchecked") to keep code clean of compiler warnings. *

* Any non-null Set. *

* This method doesn't do type checks with the given parameter, it is only there * to avoid casting in your code. This might however change (type checks could * be added) in a future major release. *

* See examples in javadoc for {@link Matchers} class * * @param clazz Type owned by the Set to avoid casting * @return empty Set */ public static Set anySetOf(Class clazz) { return anySet(); } /** * Any non-null Map. *

* See examples in javadoc for {@link Matchers} class * * @return empty Map. */ public static Map anyMap() { reportMatcher(new InstanceOf(Map.class)); return new HashMap(); } /** * Generic friendly alias to {@link Matchers#anyMap()}. * It's an alternative to @SuppressWarnings("unchecked") to keep code clean of compiler warnings. *

* Any non-null Map. *

* This method doesn't do type checks with the given parameter, it is only there * to avoid casting in your code. This might however change (type checks could * be added) in a future major release. *

* See examples in javadoc for {@link Matchers} class * * @param keyClazz Type of the map key to avoid casting * @param valueClazz Type of the value to avoid casting * @return empty Map. */ public static Map anyMapOf(Class keyClazz, Class valueClazz) { return anyMap(); } /** * Any non-null Collection. *

* See examples in javadoc for {@link Matchers} class * * @return empty Collection. */ public static Collection anyCollection() { reportMatcher(new InstanceOf(Collection.class)); return new LinkedList(); } /** * Generic friendly alias to {@link Matchers#anyCollection()}. * It's an alternative to @SuppressWarnings("unchecked") to keep code clean of compiler warnings. *

* Any non-null Collection. *

* This method doesn't do type checks with the given parameter, it is only there * to avoid casting in your code. This might however change (type checks could * be added) in a future major release. *

* See examples in javadoc for {@link Matchers} class * * @param clazz Type owned by the collection to avoid casting * @return empty Collection. */ public static Collection anyCollectionOf(Class clazz) { return anyCollection(); } /** * Object argument that implements the given class. *

* See examples in javadoc for {@link Matchers} class * * @param * the accepted type. * @param type * the class of the accepted type. * @return null. */ public static T isA(Class type) { reportMatcher(new InstanceOf(type)); return defaultValue(type); } /** * boolean argument that is equal to the given value. *

* See examples in javadoc for {@link Matchers} class * * @param value * the given value. * @return 0. */ public static boolean eq(boolean value) { reportMatcher(new Equals(value)); return false; } /** * byte argument that is equal to the given value. *

* See examples in javadoc for {@link Matchers} class * * @param value * the given value. * @return 0. */ public static byte eq(byte value) { reportMatcher(new Equals(value)); return 0; } /** * char argument that is equal to the given value. *

* See examples in javadoc for {@link Matchers} class * * @param value * the given value. * @return 0. */ public static char eq(char value) { reportMatcher(new Equals(value)); return 0; } /** * double argument that is equal to the given value. *

* See examples in javadoc for {@link Matchers} class * * @param value * the given value. * @return 0. */ public static double eq(double value) { reportMatcher(new Equals(value)); return 0; } /** * float argument that is equal to the given value. *

* See examples in javadoc for {@link Matchers} class * * @param value * the given value. * @return 0. */ public static float eq(float value) { reportMatcher(new Equals(value)); return 0; } /** * int argument that is equal to the given value. *

* See examples in javadoc for {@link Matchers} class * * @param value * the given value. * @return 0. */ public static int eq(int value) { reportMatcher(new Equals(value)); return 0; } /** * long argument that is equal to the given value. *

* See examples in javadoc for {@link Matchers} class * * @param value * the given value. * @return 0. */ public static long eq(long value) { reportMatcher(new Equals(value)); return 0; } /** * short argument that is equal to the given value. *

* See examples in javadoc for {@link Matchers} class * * @param value * the given value. * @return 0. */ public static short eq(short value) { reportMatcher(new Equals(value)); return 0; } /** * Object argument that is equal to the given value. *

* See examples in javadoc for {@link Matchers} class * * @param value * the given value. * @return null. */ public static T eq(T value) { reportMatcher(new Equals(value)); if (value==null) return null; return (T) Primitives.defaultValue(value.getClass()); } /** * Object argument that is reflection-equal to the given value with support for excluding * selected fields from a class. *

* This matcher can be used when equals() is not implemented on compared objects. * Matcher uses java reflection API to compare fields of wanted and actual object. *

* Works similarly to EqualsBuilder.reflectionEquals(this, other, exlucdeFields) from * apache commons library. *

* Warning The equality check is shallow! *

* See examples in javadoc for {@link Matchers} class * * @param value * the given value. * @param excludeFields * fields to exclude, if field does not exist it is ignored. * @return null. */ public static T refEq(T value, String... excludeFields) { reportMatcher(new ReflectionEquals(value, excludeFields));return null; } /** * Object argument that is the same as the given value. *

* See examples in javadoc for {@link Matchers} class * * @param * the type of the object, it is passed through to prevent casts. * @param value * the given value. * @return null. */ public static T same(T value) { reportMatcher(new Same(value)); if (value==null) return null; return (T) Primitives.defaultValue(value.getClass()); } /** * null argument. *

* See examples in javadoc for {@link Matchers} class * * @return null. */ public static Object isNull() { reportMatcher(Null.NULL); return null; } /** * null argument. * The class argument is provided to avoid casting. *

* See examples in javadoc for {@link Matchers} class * * @param clazz Type to avoid casting * @return null. */ public static T isNull(Class clazz) { reportMatcher(Null.NULL); return null; } /** * Not null argument. *

* alias to {@link Matchers#isNotNull()} *

* See examples in javadoc for {@link Matchers} class * * @return null. */ public static Object notNull() { reportMatcher(NotNull.NOT_NULL); return null; } /** * Not null argument, not necessary of the given class. * The class argument is provided to avoid casting. *

* alias to {@link Matchers#isNotNull(Class)} *

* See examples in javadoc for {@link Matchers} class * * @param clazz Type to avoid casting * @return null. */ public static T notNull(Class clazz) { reportMatcher(NotNull.NOT_NULL); return null; } /** * Not null argument. *

* alias to {@link Matchers#notNull()} *

* See examples in javadoc for {@link Matchers} class * * @return null. */ public static Object isNotNull() { return notNull(); } /** * Not null argument, not necessary of the given class. * The class argument is provided to avoid casting. *

* alias to {@link Matchers#notNull(Class)} *

* See examples in javadoc for {@link Matchers} class * * @param clazz Type to avoid casting * @return null. */ public static T isNotNull(Class clazz) { return notNull(clazz); } /** * String argument that contains the given substring. *

* See examples in javadoc for {@link Matchers} class * * @param substring * the substring. * @return empty String (""). */ public static String contains(String substring) { reportMatcher(new Contains(substring));return ""; } /** * String argument that matches the given regular expression. *

* See examples in javadoc for {@link Matchers} class * * @param regex * the regular expression. * @return empty String (""). */ public static String matches(String regex) { reportMatcher(new Matches(regex)); return ""; } /** * String argument that ends with the given suffix. *

* See examples in javadoc for {@link Matchers} class * * @param suffix * the suffix. * @return empty String (""). */ public static String endsWith(String suffix) { reportMatcher(new EndsWith(suffix)); return ""; } /** * String argument that starts with the given prefix. *

* See examples in javadoc for {@link Matchers} class * * @param prefix * the prefix. * @return empty String (""). */ public static String startsWith(String prefix) { reportMatcher(new StartsWith(prefix)); return ""; } /** * Allows creating custom argument matchers. * This API has changed in 2.0, please read {@link ArgumentMatcher} for rationale and migration guide. * NullPointerException auto-unboxing caveat is described below. *

* It is important to understand the use cases and available options for dealing with non-trivial arguments * before implementing custom argument matchers. This way, you can select the best possible approach * for given scenario and produce highest quality test (clean and maintainable). * Please read the documentation for {@link ArgumentMatcher} to learn about approaches and see the examples. *

* NullPointerException auto-unboxing caveat. * In rare cases when matching primitive parameter types you *must* use relevant intThat(), floatThat(), etc. method. * This way you will avoid NullPointerException during auto-unboxing. * Due to how java works we don't really have a clean way of detecting this scenario and protecting the user from this problem. * Hopefully, the javadoc describes the problem and solution well. * If you have an idea how to fix the problem, let us know via the mailing list or the issue tracker. *

* See examples in javadoc for {@link ArgumentMatcher} class * * @param matcher decides whether argument matches * @return null. */ public static T argThat(ArgumentMatcher matcher) { reportMatcher(matcher); return null; } /** * Allows creating custom char argument matchers. * Note that {@link #argThat} will not work with primitive char matchers due to NullPointerException auto-unboxing caveat. *

* See examples in javadoc for {@link Matchers} class * * @param matcher decides whether argument matches * @return 0. */ public static char charThat(ArgumentMatcher matcher) { reportMatcher(matcher); return 0; } /** * Allows creating custom boolean argument matchers. * Note that {@link #argThat} will not work with primitive boolean matchers due to NullPointerException auto-unboxing caveat. *

* See examples in javadoc for {@link Matchers} class * * @param matcher decides whether argument matches * @return false. */ public static boolean booleanThat(ArgumentMatcher matcher) { reportMatcher(matcher); return false; } /** * Allows creating custom byte argument matchers. * Note that {@link #argThat} will not work with primitive byte matchers due to NullPointerException auto-unboxing caveat. *

* See examples in javadoc for {@link Matchers} class * * @param matcher decides whether argument matches * @return 0. */ public static byte byteThat(ArgumentMatcher matcher) { reportMatcher(matcher); return 0; } /** * Allows creating custom short argument matchers. * Note that {@link #argThat} will not work with primitive short matchers due to NullPointerException auto-unboxing caveat. *

* See examples in javadoc for {@link Matchers} class * * @param matcher decides whether argument matches * @return 0. */ public static short shortThat(ArgumentMatcher matcher) { reportMatcher(matcher); return 0; } /** * Allows creating custom int argument matchers. * Note that {@link #argThat} will not work with primitive int matchers due to NullPointerException auto-unboxing caveat. *

* See examples in javadoc for {@link Matchers} class * * @param matcher decides whether argument matches * @return 0. */ public static int intThat(ArgumentMatcher matcher) { reportMatcher(matcher); return 0; } /** * Allows creating custom long argument matchers. * Note that {@link #argThat} will not work with primitive long matchers due to NullPointerException auto-unboxing caveat. *

* See examples in javadoc for {@link Matchers} class * * @param matcher decides whether argument matches * @return 0. */ public static long longThat(ArgumentMatcher matcher) { reportMatcher(matcher); return 0; } /** * Allows creating custom float argument matchers. * Note that {@link #argThat} will not work with primitive float matchers due to NullPointerException auto-unboxing caveat. *

* See examples in javadoc for {@link Matchers} class * * @param matcher decides whether argument matches * @return 0. */ public static float floatThat(ArgumentMatcher matcher) { reportMatcher(matcher); return 0; } /** * Allows creating custom double argument matchers. * Note that {@link #argThat} will not work with primitive double matchers due to NullPointerException auto-unboxing caveat. *

* See examples in javadoc for {@link Matchers} class * * @param matcher decides whether argument matches * @return 0. */ public static double doubleThat(ArgumentMatcher matcher) { reportMatcher(matcher); return 0; } private static void reportMatcher(ArgumentMatcher matcher) { MOCKING_PROGRESS.getArgumentMatcherStorage().reportMatcher(matcher); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy