Home | History | Annotate | Download | only in mockito
      1 /*
      2  * Copyright (c) 2007 Mockito contributors
      3  * This program is made available under the terms of the MIT License.
      4  */
      5 package org.mockito;
      6 
      7 import org.hamcrest.Matcher;
      8 import org.mockito.internal.matchers.*;
      9 import org.mockito.internal.matchers.apachecommons.ReflectionEquals;
     10 import org.mockito.internal.progress.HandyReturnValues;
     11 import org.mockito.internal.progress.MockingProgress;
     12 import org.mockito.internal.progress.ThreadSafeMockingProgress;
     13 
     14 import java.util.Collection;
     15 import java.util.List;
     16 import java.util.Map;
     17 import java.util.Set;
     18 
     19 /**
     20  * Allow flexible verification or stubbing. See also {@link AdditionalMatchers}.
     21  * <p>
     22  * {@link Mockito} extends Matchers so to get access to all matchers just import Mockito class statically.
     23  * <pre class="code"><code class="java">
     24  *  //stubbing using anyInt() argument matcher
     25  *  when(mockedList.get(anyInt())).thenReturn("element");
     26  *
     27  *  //following prints "element"
     28  *  System.out.println(mockedList.get(999));
     29  *
     30  *  //you can also verify using argument matcher
     31  *  verify(mockedList).get(anyInt());
     32  * </code></pre>
     33  * Scroll down to see all methods - full list of matchers.
     34  * <p>
     35  * <b>Warning:</b>
     36  * <p>
     37  * If you are using argument matchers, <b>all arguments</b> have to be provided by matchers.
     38  * <p>
     39  * E.g: (example shows verification but the same applies to stubbing):
     40  * <pre class="code"><code class="java">
     41  *   verify(mock).someMethod(anyInt(), anyString(), <b>eq("third argument")</b>);
     42  *   //above is correct - eq() is also an argument matcher
     43  *
     44  *   verify(mock).someMethod(anyInt(), anyString(), <b>"third argument"</b>);
     45  *   //above is incorrect - exception will be thrown because third argument is given without argument matcher.
     46  * </code></pre>
     47  * <p>
     48  * Matcher methods like <code>anyObject()</code>, <code>eq()</code> <b>do not</b> return matchers.
     49  * Internally, they record a matcher on a stack and return a dummy value (usually null).
     50  * This implementation is due static type safety imposed by java compiler.
     51  * The consequence is that you cannot use <code>anyObject()</code>, <code>eq()</code> methods outside of verified/stubbed method.
     52  *
     53  * <p>
     54  * <b>Warning 2:</b>
     55  * <p>
     56  * The any family methods <b>*don't do any type checks*</b>, those are only here to avoid casting
     57  * in your code. If you want to perform type checks use the {@link #isA(Class)} method.
     58  * This <b>might</b> however change (type checks could be added) in a future major release.
     59  *
     60  * <h1>Custom Argument Matchers</h1>
     61  *
     62  * Use {@link Matchers#argThat} method and pass an instance of hamcrest {@link Matcher}.
     63  * <p>
     64  * Before you start implementing your own custom argument matcher, make sure you check out {@link ArgumentCaptor} api.
     65  * <p>
     66  * So, how to implement your own argument matcher?
     67  * First, you might want to subclass {@link ArgumentMatcher} which is an hamcrest matcher with predefined describeTo() method.
     68  * Default description generated by describeTo() uses <b>decamelized class name</b> - to promote meaningful class names.
     69  * <p>
     70  * Example:
     71  *
     72  * <pre class="code"><code class="java">
     73  *   class IsListOfTwoElements extends ArgumentMatcher&lt;List&gt; {
     74  *      public boolean matches(Object list) {
     75  *          return ((List) list).size() == 2;
     76  *      }
     77  *   }
     78  *
     79  *   List mock = mock(List.class);
     80  *
     81  *   when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true);
     82  *
     83  *   mock.addAll(Arrays.asList("one", "two"));
     84  *
     85  *   verify(mock).addAll(argThat(new IsListOfTwoElements()));
     86  * </code></pre>
     87  *
     88  * To keep it readable you may want to extract method, e.g:
     89  * <pre class="code"><code class="java">
     90  *   verify(mock).addAll(<b>argThat(new IsListOfTwoElements())</b>);
     91  *   //becomes
     92  *   verify(mock).addAll(<b>listOfTwoElements()</b>);
     93  * </code></pre>
     94  *
     95  * <b>Warning:</b> Be reasonable with using complicated argument matching, especially custom argument matchers, as it can make the test less readable.
     96  * Sometimes it's better to implement equals() for arguments that are passed to mocks
     97  * (Mockito naturally uses equals() for argument matching).
     98  * This can make the test cleaner.
     99  * <p>
    100  * Also, <b>sometimes {@link ArgumentCaptor} may be a better fit</b> than custom matcher.
    101  * For example, if custom argument matcher is not likely to be reused
    102  * or you just need it to assert on argument values to complete verification of behavior.
    103  */
    104 @SuppressWarnings("unchecked")
    105 public class Matchers {
    106 
    107     private static MockingProgress mockingProgress = new ThreadSafeMockingProgress();
    108 
    109     /**
    110      * Any <code>boolean</code>, <code>Boolean</code> or <code>null</code>.
    111      * <p>
    112      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    113      * in your code. This might however change (type checks could be added) in a
    114      * future major release.
    115      * <p>
    116      * See examples in javadoc for {@link Matchers} class
    117      *
    118      * @return <code>false</code>.
    119      */
    120     public static boolean anyBoolean() {
    121         return reportMatcher(Any.ANY).returnFalse();
    122     }
    123 
    124     /**
    125      * Any <code>byte</code>, <code>Byte</code> or <code>null</code>.
    126      * <p>
    127      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    128      * in your code. This might however change (type checks could be added) in a
    129      * future major release.
    130      * <p>
    131      * See examples in javadoc for {@link Matchers} class
    132      *
    133      * @return <code>0</code>.
    134      */
    135     public static byte anyByte() {
    136         return reportMatcher(Any.ANY).returnZero();
    137     }
    138 
    139     /**
    140      * Any <code>char</code>, <code>Character</code> or <code>null</code>.
    141      * <p>
    142      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    143      * in your code. This might however change (type checks could be added) in a
    144      * future major release.
    145      * <p>
    146      * See examples in javadoc for {@link Matchers} class
    147      *
    148      * @return <code>0</code>.
    149      */
    150     public static char anyChar() {
    151         return reportMatcher(Any.ANY).returnChar();
    152     }
    153 
    154     /**
    155      * Any int, Integer or <code>null</code>.
    156      * <p>
    157      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    158      * in your code. This might however change (type checks could be added) in a
    159      * future major release.
    160      * <p>
    161      * See examples in javadoc for {@link Matchers} class
    162      *
    163      * @return <code>0</code>.
    164      */
    165     public static int anyInt() {
    166         return reportMatcher(Any.ANY).returnZero();
    167     }
    168 
    169     /**
    170      * Any <code>long</code>, <code>Long</code> or <code>null</code>.
    171      * <p>
    172      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    173      * in your code. This might however change (type checks could be added) in a
    174      * future major release.
    175      * <p>
    176      * See examples in javadoc for {@link Matchers} class
    177      *
    178      * @return <code>0</code>.
    179      */
    180     public static long anyLong() {
    181         return reportMatcher(Any.ANY).returnZero();
    182     }
    183 
    184     /**
    185      * Any <code>float</code>, <code>Float</code> or <code>null</code>.
    186      * <p>
    187      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    188      * in your code. This might however change (type checks could be added) in a
    189      * future major release.
    190      * <p>
    191      * See examples in javadoc for {@link Matchers} class
    192      *
    193      * @return <code>0</code>.
    194      */
    195     public static float anyFloat() {
    196         return reportMatcher(Any.ANY).returnZero();
    197     }
    198 
    199     /**
    200      * Any <code>double</code>, <code>Double</code> or <code>null</code>.
    201      * <p>
    202      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    203      * in your code. This might however change (type checks could be added) in a
    204      * future major release.
    205      * <p>
    206      * See examples in javadoc for {@link Matchers} class
    207      *
    208      * @return <code>0</code>.
    209      */
    210     public static double anyDouble() {
    211         return reportMatcher(Any.ANY).returnZero();
    212     }
    213 
    214     /**
    215      * Any <code>short</code>, <code>Short</code> or <code>null</code>.
    216      * <p>
    217      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    218      * in your code. This might however change (type checks could be added) in a
    219      * future major release.
    220      * <p>
    221      * See examples in javadoc for {@link Matchers} class
    222      *
    223      * @return <code>0</code>.
    224      */
    225     public static short anyShort() {
    226         return reportMatcher(Any.ANY).returnZero();
    227     }
    228 
    229     /**
    230      * Any <code>Object</code> or <code>null</code>.
    231      * <p>
    232      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    233      * in your code. This might however change (type checks could be added) in a
    234      * future major release.
    235      * <p>
    236      * Has aliases: {@link #any()} and {@link #any(Class clazz)}
    237      * <p>
    238      * See examples in javadoc for {@link Matchers} class
    239      *
    240      * @return <code>null</code>.
    241      */
    242     public static <T> T anyObject() {
    243         return (T) reportMatcher(Any.ANY).returnNull();
    244     }
    245 
    246     /**
    247      * Any vararg, meaning any number and values of arguments.
    248      * <p>
    249      * Example:
    250      * <pre class="code"><code class="java">
    251      *   //verification:
    252      *   mock.foo(1, 2);
    253      *   mock.foo(1, 2, 3, 4);
    254      *
    255      *   verify(mock, times(2)).foo(anyVararg());
    256      *
    257      *   //stubbing:
    258      *   when(mock.foo(anyVararg()).thenReturn(100);
    259      *
    260      *   //prints 100
    261      *   System.out.println(mock.foo(1, 2));
    262      *   //also prints 100
    263      *   System.out.println(mock.foo(1, 2, 3, 4));
    264      * </code></pre>
    265      * See examples in javadoc for {@link Matchers} class
    266      *
    267      * @return <code>null</code>.
    268      */
    269     public static <T> T anyVararg() {
    270         return (T) reportMatcher(AnyVararg.ANY_VARARG).returnNull();
    271     }
    272 
    273     /**
    274      * Any kind object, not necessary of the given class.
    275      * The class argument is provided only to avoid casting.
    276      * <p>
    277      * Sometimes looks better than <code>anyObject()</code> - especially when explicit casting is required
    278      * <p>
    279      * Alias to {@link Matchers#anyObject()}
    280      * <p>
    281      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    282      * in your code. This might however change (type checks could be added) in a
    283      * future major release.
    284      * <p>
    285      * See examples in javadoc for {@link Matchers} class
    286      *
    287      * @param clazz The type to avoid casting
    288      * @return <code>null</code>.
    289      */
    290     public static <T> T any(Class<T> clazz) {
    291         return (T) reportMatcher(Any.ANY).returnFor(clazz);
    292     }
    293 
    294     /**
    295      * Any object or <code>null</code>.
    296      * <p>
    297      * Shorter alias to {@link Matchers#anyObject()}
    298      * <p>
    299      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    300      * in your code. This might however change (type checks could be added) in a
    301      * future major release.
    302      * <p>
    303      * See examples in javadoc for {@link Matchers} class
    304      *
    305      * @return <code>null</code>.
    306      */
    307     public static <T> T any() {
    308         return (T) anyObject();
    309     }
    310 
    311     /**
    312      * Any <code>String</code> or <code>null</code>.
    313      * <p>
    314      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    315      * in your code. This might however change (type checks could be added) in a
    316      * future major release.
    317      * <p>
    318      * See examples in javadoc for {@link Matchers} class
    319      *
    320      * @return empty String ("")
    321      */
    322     public static String anyString() {
    323         return reportMatcher(Any.ANY).returnString();
    324     }
    325 
    326     /**
    327      * Any <code>List</code> or <code>null</code>.
    328      * <p>
    329      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    330      * in your code. This might however change (type checks could be added) in a
    331      * future major release.
    332      * <p>
    333      * See examples in javadoc for {@link Matchers} class
    334      *
    335      * @return empty List.
    336      */
    337     public static List anyList() {
    338         return reportMatcher(Any.ANY).returnList();
    339     }
    340 
    341     /**
    342      * Generic friendly alias to {@link Matchers#anyList()}.
    343      * It's an alternative to &#064;SuppressWarnings("unchecked") to keep code clean of compiler warnings.
    344      * <p>
    345      * Any <code>List</code> or <code>null</code>.
    346      * <p>
    347      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    348      * in your code. This might however change (type checks could be added) in a
    349      * future major release.
    350      * <p>
    351      * See examples in javadoc for {@link Matchers} class
    352      *
    353      * @param clazz Type owned by the list to avoid casting
    354      * @return empty List.
    355      */
    356     public static <T> List<T> anyListOf(Class<T> clazz) {
    357         return (List) reportMatcher(Any.ANY).returnList();
    358     }
    359 
    360     /**
    361      * Any <code>Set</code> or <code>null</code>.
    362      * <p>
    363      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    364      * in your code. This might however change (type checks could be added) in a
    365      * future major release.
    366      * <p>
    367      * See examples in javadoc for {@link Matchers} class
    368      *
    369      * @return empty Set
    370      */
    371     public static Set anySet() {
    372         return reportMatcher(Any.ANY).returnSet();
    373     }
    374 
    375     /**
    376      * Generic friendly alias to {@link Matchers#anySet()}.
    377      * It's an alternative to &#064;SuppressWarnings("unchecked") to keep code clean of compiler warnings.
    378      * <p>
    379      * Any <code>Set</code> or <code>null</code>
    380      * <p>
    381      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    382      * in your code. This might however change (type checks could be added) in a
    383      * future major release.
    384      * <p>
    385      * See examples in javadoc for {@link Matchers} class
    386      *
    387      * @param clazz Type owned by the Set to avoid casting
    388      * @return empty Set
    389      */
    390     public static <T> Set<T> anySetOf(Class<T> clazz) {
    391         return (Set) reportMatcher(Any.ANY).returnSet();
    392     }
    393 
    394     /**
    395      * Any <code>Map</code> or <code>null</code>.
    396      * <p>
    397      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    398      * in your code. This might however change (type checks could be added) in a
    399      * future major release.
    400      * <p>
    401      * See examples in javadoc for {@link Matchers} class
    402      *
    403      * @return empty Map.
    404      */
    405     public static Map anyMap() {
    406         return reportMatcher(Any.ANY).returnMap();
    407     }
    408 
    409     /**
    410      * Generic friendly alias to {@link Matchers#anyMap()}.
    411      * It's an alternative to &#064;SuppressWarnings("unchecked") to keep code clean of compiler warnings.
    412      * <p>
    413      * Any <code>Map</code> or <code>null</code>
    414      * <p>
    415      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    416      * in your code. This might however change (type checks could be added) in a
    417      * future major release.
    418      * <p>
    419      * See examples in javadoc for {@link Matchers} class
    420      *
    421      * @param keyClazz Type of the map key to avoid casting
    422      * @param valueClazz Type of the value to avoid casting
    423      * @return empty Map.
    424      */
    425     public static <K, V>  Map<K, V> anyMapOf(Class<K> keyClazz, Class<V> valueClazz) {
    426         return reportMatcher(Any.ANY).returnMap();
    427     }
    428 
    429     /**
    430      * Any <code>Collection</code> or <code>null</code>.
    431      * <p>
    432      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    433      * in your code. This might however change (type checks could be added) in a
    434      * future major release.
    435      * <p>
    436      * See examples in javadoc for {@link Matchers} class
    437      *
    438      * @return empty Collection.
    439      */
    440     public static Collection anyCollection() {
    441         return reportMatcher(Any.ANY).returnList();
    442     }
    443 
    444     /**
    445      * Generic friendly alias to {@link Matchers#anyCollection()}.
    446      * It's an alternative to &#064;SuppressWarnings("unchecked") to keep code clean of compiler warnings.
    447      * <p>
    448      * Any <code>Collection</code> or <code>null</code>.
    449      * <p>
    450      * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
    451      * in your code. This might however change (type checks could be added) in a
    452      * future major release.
    453      * <p>
    454      * See examples in javadoc for {@link Matchers} class
    455      *
    456      * @param clazz Type owned by the collection to avoid casting
    457      * @return empty Collection.
    458      */
    459     public static <T> Collection<T> anyCollectionOf(Class<T> clazz) {
    460         return (Collection) reportMatcher(Any.ANY).returnList();
    461     }
    462 
    463     /**
    464      * <code>Object</code> argument that implements the given class.
    465      * <p>
    466      * See examples in javadoc for {@link Matchers} class
    467      *
    468      * @param <T>
    469      *            the accepted type.
    470      * @param clazz
    471      *            the class of the accepted type.
    472      * @return <code>null</code>.
    473      */
    474     public static <T> T isA(Class<T> clazz) {
    475         return reportMatcher(new InstanceOf(clazz)).<T>returnFor(clazz);
    476     }
    477 
    478     /**
    479      * <code>boolean</code> argument that is equal to the given value.
    480      * <p>
    481      * See examples in javadoc for {@link Matchers} class
    482      *
    483      * @param value
    484      *            the given value.
    485      * @return <code>0</code>.
    486      */
    487     public static boolean eq(boolean value) {
    488         return reportMatcher(new Equals(value)).returnFalse();
    489     }
    490 
    491     /**
    492      * <code>byte</code> argument that is equal to the given value.
    493      * <p>
    494      * See examples in javadoc for {@link Matchers} class
    495      *
    496      * @param value
    497      *            the given value.
    498      * @return <code>0</code>.
    499      */
    500     public static byte eq(byte value) {
    501         return reportMatcher(new Equals(value)).returnZero();
    502     }
    503 
    504     /**
    505      * <code>char</code> argument that is equal to the given value.
    506      * <p>
    507      * See examples in javadoc for {@link Matchers} class
    508      *
    509      * @param value
    510      *            the given value.
    511      * @return <code>0</code>.
    512      */
    513     public static char eq(char value) {
    514         return reportMatcher(new Equals(value)).returnChar();
    515     }
    516 
    517     /**
    518      * <code>double</code> argument that is equal to the given value.
    519      * <p>
    520      * See examples in javadoc for {@link Matchers} class
    521      *
    522      * @param value
    523      *            the given value.
    524      * @return <code>0</code>.
    525      */
    526     public static double eq(double value) {
    527         return reportMatcher(new Equals(value)).returnZero();
    528     }
    529 
    530     /**
    531      * <code>float</code> argument that is equal to the given value.
    532      * <p>
    533      * See examples in javadoc for {@link Matchers} class
    534      *
    535      * @param value
    536      *            the given value.
    537      * @return <code>0</code>.
    538      */
    539     public static float eq(float value) {
    540         return reportMatcher(new Equals(value)).returnZero();
    541     }
    542 
    543     /**
    544      * <code>int</code> argument that is equal to the given value.
    545      * <p>
    546      * See examples in javadoc for {@link Matchers} class
    547      *
    548      * @param value
    549      *            the given value.
    550      * @return <code>0</code>.
    551      */
    552     public static int eq(int value) {
    553         return reportMatcher(new Equals(value)).returnZero();
    554     }
    555 
    556     /**
    557      * <code>long</code> argument that is equal to the given value.
    558      * <p>
    559      * See examples in javadoc for {@link Matchers} class
    560      *
    561      * @param value
    562      *            the given value.
    563      * @return <code>0</code>.
    564      */
    565     public static long eq(long value) {
    566         return reportMatcher(new Equals(value)).returnZero();
    567     }
    568 
    569     /**
    570      * <code>short</code> argument that is equal to the given value.
    571      * <p>
    572      * See examples in javadoc for {@link Matchers} class
    573      *
    574      * @param value
    575      *            the given value.
    576      * @return <code>0</code>.
    577      */
    578     public static short eq(short value) {
    579         return reportMatcher(new Equals(value)).returnZero();
    580     }
    581 
    582     /**
    583      * Object argument that is equal to the given value.
    584      * <p>
    585      * See examples in javadoc for {@link Matchers} class
    586      *
    587      * @param value
    588      *            the given value.
    589      * @return <code>null</code>.
    590      */
    591     public static <T> T eq(T value) {
    592         return (T) reportMatcher(new Equals(value)).<T>returnFor(value);
    593     }
    594 
    595     /**
    596      * Object argument that is reflection-equal to the given value with support for excluding
    597      * selected fields from a class.
    598      * <p>
    599      * This matcher can be used when equals() is not implemented on compared objects.
    600      * Matcher uses java reflection API to compare fields of wanted and actual object.
    601      * <p>
    602      * Works similarly to EqualsBuilder.reflectionEquals(this, other, exlucdeFields) from
    603      * apache commons library.
    604      * <p>
    605      * <b>Warning</b> The equality check is shallow!
    606      * <p>
    607      * See examples in javadoc for {@link Matchers} class
    608      *
    609      * @param value
    610      *            the given value.
    611      * @param excludeFields
    612      *            fields to exclude, if field does not exist it is ignored.
    613      * @return <code>null</code>.
    614      */
    615     public static <T> T refEq(T value, String... excludeFields) {
    616         return reportMatcher(new ReflectionEquals(value, excludeFields)).<T>returnNull();
    617     }
    618 
    619     /**
    620      * Object argument that is the same as the given value.
    621      * <p>
    622      * See examples in javadoc for {@link Matchers} class
    623      *
    624      * @param <T>
    625      *            the type of the object, it is passed through to prevent casts.
    626      * @param value
    627      *            the given value.
    628      * @return <code>null</code>.
    629      */
    630     public static <T> T same(T value) {
    631         return (T) reportMatcher(new Same(value)).<T>returnFor(value);
    632     }
    633 
    634     /**
    635      * <code>null</code> argument.
    636      * <p>
    637      * See examples in javadoc for {@link Matchers} class
    638      *
    639      * @return <code>null</code>.
    640      */
    641     public static Object isNull() {
    642         return reportMatcher(Null.NULL).returnNull();
    643     }
    644 
    645     /**
    646      * <code>null</code> argument.
    647      * The class argument is provided to avoid casting.
    648      * <p>
    649      * See examples in javadoc for {@link Matchers} class
    650      *
    651      * @param clazz Type to avoid casting
    652      * @return <code>null</code>.
    653      */
    654     public static <T> T isNull(Class<T> clazz) {
    655         return (T) reportMatcher(Null.NULL).returnNull();
    656     }
    657 
    658     /**
    659      * Not <code>null</code> argument.
    660      * <p>
    661      * alias to {@link Matchers#isNotNull()}
    662      * <p>
    663      * See examples in javadoc for {@link Matchers} class
    664      *
    665      * @return <code>null</code>.
    666      */
    667     public static Object notNull() {
    668         return reportMatcher(NotNull.NOT_NULL).returnNull();
    669     }
    670 
    671     /**
    672      * Not <code>null</code> argument, not necessary of the given class.
    673      * The class argument is provided to avoid casting.
    674      * <p>
    675      * alias to {@link Matchers#isNotNull(Class)}
    676      * <p>
    677      * See examples in javadoc for {@link Matchers} class
    678      *
    679      * @param clazz Type to avoid casting
    680      * @return <code>null</code>.
    681      */
    682     public static <T> T notNull(Class<T> clazz) {
    683         return (T) reportMatcher(NotNull.NOT_NULL).returnNull();
    684     }
    685 
    686     /**
    687      * Not <code>null</code> argument.
    688      * <p>
    689      * alias to {@link Matchers#notNull()}
    690      * <p>
    691      * See examples in javadoc for {@link Matchers} class
    692      *
    693      * @return <code>null</code>.
    694      */
    695     public static Object isNotNull() {
    696         return notNull();
    697     }
    698 
    699     /**
    700      * Not <code>null</code> argument, not necessary of the given class.
    701      * The class argument is provided to avoid casting.
    702      * <p>
    703      * alias to {@link Matchers#notNull(Class)}
    704      * <p>
    705      * See examples in javadoc for {@link Matchers} class
    706      *
    707      * @param clazz Type to avoid casting
    708      * @return <code>null</code>.
    709      */
    710     public static <T> T isNotNull(Class<T> clazz) {
    711         return notNull(clazz);
    712     }
    713 
    714     /**
    715      * <code>String</code> argument that contains the given substring.
    716      * <p>
    717      * See examples in javadoc for {@link Matchers} class
    718      *
    719      * @param substring
    720      *            the substring.
    721      * @return empty String ("").
    722      */
    723     public static String contains(String substring) {
    724         return reportMatcher(new Contains(substring)).returnString();
    725     }
    726 
    727     /**
    728      * <code>String</code> argument that matches the given regular expression.
    729      * <p>
    730      * See examples in javadoc for {@link Matchers} class
    731      *
    732      * @param regex
    733      *            the regular expression.
    734      * @return empty String ("").
    735      */
    736     public static String matches(String regex) {
    737         return reportMatcher(new Matches(regex)).returnString();
    738     }
    739 
    740     /**
    741      * <code>String</code> argument that ends with the given suffix.
    742      * <p>
    743      * See examples in javadoc for {@link Matchers} class
    744      *
    745      * @param suffix
    746      *            the suffix.
    747      * @return empty String ("").
    748      */
    749     public static String endsWith(String suffix) {
    750         return reportMatcher(new EndsWith(suffix)).returnString();
    751     }
    752 
    753     /**
    754      * <code>String</code> argument that starts with the given prefix.
    755      * <p>
    756      * See examples in javadoc for {@link Matchers} class
    757      *
    758      * @param prefix
    759      *            the prefix.
    760      * @return empty String ("").
    761      */
    762     public static String startsWith(String prefix) {
    763         return reportMatcher(new StartsWith(prefix)).returnString();
    764     }
    765 
    766     /**
    767      * Allows creating custom argument matchers.
    768      * <p>
    769      * In rare cases when the parameter is a primitive then you <b>*must*</b> use relevant intThat(), floatThat(), etc. method.
    770      * This way you will avoid <code>NullPointerException</code> during auto-unboxing.
    771      * <p>
    772      * See examples in javadoc for {@link ArgumentMatcher} class
    773      *
    774      * @param matcher decides whether argument matches
    775      * @return <code>null</code>.
    776      */
    777     public static <T> T argThat(Matcher<T> matcher) {
    778         return reportMatcher(matcher).<T>returnNull();
    779     }
    780 
    781     /**
    782      * Allows creating custom <code>Character</code> argument matchers.
    783      * <p>
    784      * See examples in javadoc for {@link Matchers} class
    785      *
    786      * @param matcher decides whether argument matches
    787      * @return <code>0</code>.
    788      */
    789     public static char charThat(Matcher<Character> matcher) {
    790         return reportMatcher(matcher).returnChar();
    791     }
    792 
    793     /**
    794      * Allows creating custom <code>Boolean</code> argument matchers.
    795      * <p>
    796      * See examples in javadoc for {@link Matchers} class
    797      *
    798      * @param matcher decides whether argument matches
    799      * @return <code>false</code>.
    800      */
    801     public static boolean booleanThat(Matcher<Boolean> matcher) {
    802         return reportMatcher(matcher).returnFalse();
    803     }
    804 
    805     /**
    806      * Allows creating custom <code>Byte</code> argument matchers.
    807      * <p>
    808      * See examples in javadoc for {@link Matchers} class
    809      *
    810      * @param matcher decides whether argument matches
    811      * @return <code>0</code>.
    812      */
    813     public static byte byteThat(Matcher<Byte> matcher) {
    814         return reportMatcher(matcher).returnZero();
    815     }
    816 
    817     /**
    818      * Allows creating custom <code>Short</code> argument matchers.
    819      * <p>
    820      * See examples in javadoc for {@link Matchers} class
    821      *
    822      * @param matcher decides whether argument matches
    823      * @return <code>0</code>.
    824      */
    825     public static short shortThat(Matcher<Short> matcher) {
    826         return reportMatcher(matcher).returnZero();
    827     }
    828 
    829     /**
    830      * Allows creating custom <code>Integer</code> argument matchers.
    831      * <p>
    832      * See examples in javadoc for {@link Matchers} class
    833      *
    834      * @param matcher decides whether argument matches
    835      * @return <code>0</code>.
    836      */
    837     public static int intThat(Matcher<Integer> matcher) {
    838         return reportMatcher(matcher).returnZero();
    839     }
    840 
    841     /**
    842      * Allows creating custom <code>Long</code> argument matchers.
    843      * <p>
    844      * See examples in javadoc for {@link Matchers} class
    845      *
    846      * @param matcher decides whether argument matches
    847      * @return <code>0</code>.
    848      */
    849     public static long longThat(Matcher<Long> matcher) {
    850         return reportMatcher(matcher).returnZero();
    851     }
    852 
    853     /**
    854      * Allows creating custom <code>Float</code> argument matchers.
    855      * <p>
    856      * See examples in javadoc for {@link Matchers} class
    857      *
    858      * @param matcher decides whether argument matches
    859      * @return <code>0</code>.
    860      */
    861     public static float floatThat(Matcher<Float> matcher) {
    862         return reportMatcher(matcher).returnZero();
    863     }
    864 
    865     /**
    866      * Allows creating custom <code>Double</code> argument matchers.
    867      * <p>
    868      * See examples in javadoc for {@link Matchers} class
    869      *
    870      * @param matcher decides whether argument matches
    871      * @return <code>0</code>.
    872      */
    873     public static double doubleThat(Matcher<Double> matcher) {
    874         return reportMatcher(matcher).returnZero();
    875     }
    876 
    877     private static HandyReturnValues reportMatcher(Matcher<?> matcher) {
    878         return mockingProgress.getArgumentMatcherStorage().reportMatcher(matcher);
    879     }
    880 }
    881