• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.matchers;
7 
8 import org.junit.Before;
9 import org.junit.Test;
10 import org.mockito.ArgumentMatcher;
11 import org.mockito.Mockito;
12 import org.mockitousage.IMethods;
13 import org.mockitoutil.TestBase;
14 
15 import static org.junit.Assert.assertEquals;
16 import static org.junit.Assert.fail;
17 import static org.assertj.core.api.Assertions.assertThat;
18 import static org.mockito.Matchers.*;
19 import static org.mockito.Mockito.verify;
20 import static org.mockito.Mockito.when;
21 
22 public class CustomMatchersTest extends TestBase {
23 
24     private final class ContainsFoo implements ArgumentMatcher<String> {
matches(String arg)25         public boolean matches(String arg) {
26             return arg.contains("foo");
27         }
28     }
29 
30     private final class IsAnyBoolean implements ArgumentMatcher<Boolean> {
matches(Boolean arg)31         public boolean matches(Boolean arg) {
32             return true;
33         }
34     }
35 
36     private final class IsSorZ implements ArgumentMatcher<Character> {
matches(Character character)37         public boolean matches(Character character) {
38             return character.equals('s') || character.equals('z');
39         }
40     }
41 
42     private final class IsZeroOrOne<T extends Number> implements ArgumentMatcher<T> {
matches(T number)43         public boolean matches(T number) {
44             return number.intValue() == 0 || number.intValue() == 1;
45         }
46     }
47 
48     private IMethods mock;
49 
50     @Before
setUp()51     public void setUp() {
52         mock = Mockito.mock(IMethods.class);
53     }
54 
55     @Test
shouldUseCustomBooleanMatcher()56     public void shouldUseCustomBooleanMatcher() {
57         when(mock.oneArg(booleanThat(new IsAnyBoolean()))).thenReturn("foo");
58 
59         assertEquals("foo", mock.oneArg(true));
60         assertEquals("foo", mock.oneArg(false));
61 
62         assertEquals(null, mock.oneArg("x"));
63     }
64 
65     @Test
shouldUseCustomCharMatcher()66     public void shouldUseCustomCharMatcher() {
67         when(mock.oneArg(charThat(new IsSorZ()))).thenReturn("foo");
68 
69         assertEquals("foo", mock.oneArg('s'));
70         assertEquals("foo", mock.oneArg('z'));
71         assertEquals(null, mock.oneArg('x'));
72     }
73 
74     class Article {
75 
76         private int pageNumber;
77         private String headline;
78 
Article(int pageNumber, String headline)79         public Article(int pageNumber, String headline) {
80             super();
81             this.pageNumber = pageNumber;
82             this.headline = headline;
83         }
84 
getPageNumber()85         public int getPageNumber() {
86             return pageNumber;
87         }
88 
getHeadline()89         public String getHeadline() {
90             return headline;
91         }
92     }
93 
94     @Test
shouldUseCustomPrimitiveNumberMatchers()95     public void shouldUseCustomPrimitiveNumberMatchers() {
96         when(mock.oneArg(byteThat(new IsZeroOrOne<Byte>()))).thenReturn("byte");
97         when(mock.oneArg(shortThat(new IsZeroOrOne<Short>()))).thenReturn("short");
98         when(mock.oneArg(intThat(new IsZeroOrOne<Integer>()))).thenReturn("int");
99         when(mock.oneArg(longThat(new IsZeroOrOne<Long>()))).thenReturn("long");
100         when(mock.oneArg(floatThat(new IsZeroOrOne<Float>()))).thenReturn("float");
101         when(mock.oneArg(doubleThat(new IsZeroOrOne<Double>()))).thenReturn("double");
102 
103         assertEquals("byte", mock.oneArg((byte) 0));
104         assertEquals("short", mock.oneArg((short) 1));
105         assertEquals("int", mock.oneArg(0));
106         assertEquals("long", mock.oneArg(1L));
107         assertEquals("float", mock.oneArg(0F));
108         assertEquals("double", mock.oneArg(1.0));
109 
110         assertEquals(null, mock.oneArg(2));
111         assertEquals(null, mock.oneArg("foo"));
112     }
113 
114     @Test
shouldUseCustomObjectMatcher()115     public void shouldUseCustomObjectMatcher() {
116         when(mock.oneArg(argThat(new ContainsFoo()))).thenReturn("foo");
117 
118         assertEquals("foo", mock.oneArg("foo"));
119         assertEquals(null, mock.oneArg("bar"));
120     }
121 
122     @Test
shouldCustomMatcherPrintDescriptionBasedOnName()123     public void shouldCustomMatcherPrintDescriptionBasedOnName() {
124         mock.simpleMethod("foo");
125 
126         try {
127             verify(mock).simpleMethod(containsTest());
128             fail();
129         } catch (AssertionError e) {
130             assertThat(e).hasMessageContaining("<String that contains xxx>");
131         }
132     }
133 
containsTest()134     private String containsTest() {
135         return argThat(new StringThatContainsXxx());
136     }
137 
138     private final class StringThatContainsXxx implements ArgumentMatcher<String> {
matches(String arg)139         public boolean matches(String arg) {
140             return arg.contains("xxx");
141         }
142     }
143 
144     @Test
shouldAnonymousCustomMatcherPrintDefaultDescription()145     public void shouldAnonymousCustomMatcherPrintDefaultDescription() {
146         mock.simpleMethod("foo");
147 
148         try {
149             verify(mock).simpleMethod((String) argThat(new ArgumentMatcher<Object>() {
150                 public boolean matches(Object argument) {
151                     return false;
152                 }}));
153             fail();
154         } catch (AssertionError e) {
155             assertThat(e)
156                 .hasMessageContaining("<custom argument matcher>")
157                 .hasMessageContaining("foo");
158         }
159     }
160 }
161