• 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 package org.mockito;
6 
7 import org.mockito.stubbing.Answer;
8 import org.mockito.stubbing.OngoingStubbing;
9 import org.mockito.stubbing.Stubber;
10 
11 /**
12  * Behavior Driven Development style of writing tests uses <b>//given //when //then</b> comments as fundamental parts of your test methods.
13  * This is exactly how we write our tests and we warmly encourage you to do so!
14  * <p>
15  * Start learning about BDD here: <a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">http://en.wikipedia.org/wiki/Behavior_Driven_Development</a>
16  * <p>
17  * The problem is that current stubbing api with canonical role of <b>when</b> word does not integrate nicely with <b>//given //when //then</b> comments.
18  * It's because stubbing belongs to <b>given</b> component of the test and not to the <b>when</b> component of the test.
19  * Hence {@link BDDMockito} class introduces an alias so that you stub method calls with {@link BDDMockito#given(Object)} method.
20  * Now it really nicely integrates with the <b>given</b> component of a BDD style test!
21  * <p>
22  * Here is how the test might look like:
23  * <pre class="code"><code class="java">
24  * import static org.mockito.BDDMockito.*;
25  *
26  * Seller seller = mock(Seller.class);
27  * Shop shop = new Shop(seller);
28  *
29  * public void shouldBuyBread() throws Exception {
30  *   //given
31  *   given(seller.askForBread()).willReturn(new Bread());
32  *
33  *   //when
34  *   Goods goods = shop.buyBread();
35  *
36  *   //then
37  *   assertThat(goods, containBread());
38  * }
39  * </code></pre>
40  *
41  * Stubbing voids with throwables:
42  * <pre class="code"><code class="java">
43  *   //given
44  *   willThrow(new RuntimeException("boo")).given(mock).foo();
45  *
46  *   //when
47  *   Result result = systemUnderTest.perform();
48  *
49  *   //then
50  *   assertEquals(failure, result);
51  * </code></pre>
52  * <p>
53  * One of the purposes of BDDMockito is also to show how to tailor the mocking syntax to a different programming style.
54  *
55  * @since 1.8.0
56  */
57 @SuppressWarnings("unchecked")
58 public class BDDMockito extends Mockito {
59 
60     /**
61      * See original {@link OngoingStubbing}
62      * @since 1.8.0
63      */
64     public static interface BDDMyOngoingStubbing<T> {
65 
66         /**
67          * See original {@link OngoingStubbing#thenAnswer(Answer)}
68          * @since 1.8.0
69          */
willAnswer(Answer<?> answer)70         BDDMyOngoingStubbing<T> willAnswer(Answer<?> answer);
71 
72         /**
73          * See original {@link OngoingStubbing#then(Answer)}
74          * @since 1.9.0
75          */
will(Answer<?> answer)76         BDDMyOngoingStubbing<T> will(Answer<?> answer);
77 
78         /**
79          * See original {@link OngoingStubbing#thenReturn(Object)}
80          * @since 1.8.0
81          */
willReturn(T value)82         BDDMyOngoingStubbing<T> willReturn(T value);
83 
84         /**
85          * See original {@link OngoingStubbing#thenReturn(Object, Object[])}
86          * @since 1.8.0
87          */
willReturn(T value, T... values)88         BDDMyOngoingStubbing<T> willReturn(T value, T... values);
89 
90         /**
91          * See original {@link OngoingStubbing#thenThrow(Throwable...)}
92          * @since 1.8.0
93          */
willThrow(Throwable... throwables)94         BDDMyOngoingStubbing<T> willThrow(Throwable... throwables);
95 
96         /**
97          * See original {@link OngoingStubbing#thenThrow(Class[])}
98          * @since 1.9.0
99          */
willThrow(Class<? extends Throwable>.... throwableClasses)100         BDDMyOngoingStubbing<T> willThrow(Class<? extends Throwable>... throwableClasses);
101 
102         /**
103          * See original {@link OngoingStubbing#thenCallRealMethod()}
104          * @since 1.9.0
105          */
willCallRealMethod()106         BDDMyOngoingStubbing<T> willCallRealMethod();
107 
108         /**
109          * See original {@link OngoingStubbing#getMock()}
110          * @since 1.9.0
111          */
getMock()112         <M> M getMock();
113     }
114 
115     public static class BDDOngoingStubbingImpl<T> implements BDDMyOngoingStubbing<T> {
116 
117         private final OngoingStubbing<T> mockitoOngoingStubbing;
118 
BDDOngoingStubbingImpl(OngoingStubbing<T> ongoingStubbing)119         public BDDOngoingStubbingImpl(OngoingStubbing<T> ongoingStubbing) {
120             this.mockitoOngoingStubbing = ongoingStubbing;
121         }
122 
123         /* (non-Javadoc)
124          * @see BDDMockito.BDDMyOngoingStubbing#willAnswer(Answer)
125          */
willAnswer(Answer<?> answer)126         public BDDMyOngoingStubbing<T> willAnswer(Answer<?> answer) {
127             return new BDDOngoingStubbingImpl<T>(mockitoOngoingStubbing.thenAnswer(answer));
128         }
129 
130         /* (non-Javadoc)
131          * @see BDDMockito.BDDMyOngoingStubbing#will(Answer)
132          */
will(Answer<?> answer)133         public BDDMyOngoingStubbing<T> will(Answer<?> answer) {
134             return new BDDOngoingStubbingImpl<T>(mockitoOngoingStubbing.then(answer));
135         }
136 
137         /* (non-Javadoc)
138          * @see BDDMockito.BDDMyOngoingStubbing#willReturn(java.lang.Object)
139          */
willReturn(T value)140         public BDDMyOngoingStubbing<T> willReturn(T value) {
141             return new BDDOngoingStubbingImpl<T>(mockitoOngoingStubbing.thenReturn(value));
142         }
143 
144         /* (non-Javadoc)
145          * @see BDDMockito.BDDMyOngoingStubbing#willReturn(java.lang.Object, T[])
146          */
willReturn(T value, T... values)147         public BDDMyOngoingStubbing<T> willReturn(T value, T... values) {
148             return new BDDOngoingStubbingImpl<T>(mockitoOngoingStubbing.thenReturn(value, values));
149         }
150 
151         /* (non-Javadoc)
152          * @see BDDMockito.BDDMyOngoingStubbing#willThrow(java.lang.Throwable[])
153          */
willThrow(Throwable... throwables)154         public BDDMyOngoingStubbing<T> willThrow(Throwable... throwables) {
155             return new BDDOngoingStubbingImpl<T>(mockitoOngoingStubbing.thenThrow(throwables));
156         }
157         /* (non-Javadoc)
158          * @see BDDMockito.BDDMyOngoingStubbing#willThrow(java.lang.Class[])
159          */
willThrow(Class<? extends Throwable>.... throwableClasses)160         public BDDMyOngoingStubbing<T> willThrow(Class<? extends Throwable>... throwableClasses) {
161             return new BDDOngoingStubbingImpl<T>(mockitoOngoingStubbing.thenThrow(throwableClasses));
162         }
163 
willCallRealMethod()164         public BDDMyOngoingStubbing<T> willCallRealMethod() {
165             return new BDDOngoingStubbingImpl<T>(mockitoOngoingStubbing.thenCallRealMethod());
166         }
167 
getMock()168         public <M> M getMock() {
169             return (M) mockitoOngoingStubbing.getMock();
170         }
171     }
172 
173     /**
174      * see original {@link Mockito#when(Object)}
175      * @since 1.8.0
176      */
given(T methodCall)177     public static <T> BDDMyOngoingStubbing<T> given(T methodCall) {
178         return new BDDOngoingStubbingImpl<T>(Mockito.when(methodCall));
179     }
180 
181     /**
182      * See original {@link Stubber}
183      * @since 1.8.0
184      */
185     public static interface BDDStubber {
186         /**
187          * See original {@link Stubber#doAnswer(Answer)}
188          * @since 1.8.0
189          */
willAnswer(Answer answer)190         BDDStubber willAnswer(Answer answer);
191 
192         /**
193          * See original {@link Stubber#doNothing()}
194          * @since 1.8.0
195          */
willNothing()196         BDDStubber willNothing();
197 
198         /**
199          * See original {@link Stubber#doReturn(Object)}
200          * @since 1.8.0
201          */
willReturn(Object toBeReturned)202         BDDStubber willReturn(Object toBeReturned);
203 
204         /**
205          * See original {@link Stubber#doThrow(Throwable)}
206          * @since 1.8.0
207          */
willThrow(Throwable toBeThrown)208         BDDStubber willThrow(Throwable toBeThrown);
209 
210         /**
211          * See original {@link Stubber#doThrow(Class)}
212          * @since 1.9.0
213          */
willThrow(Class<? extends Throwable> toBeThrown)214         BDDStubber willThrow(Class<? extends Throwable> toBeThrown);
215 
216         /**
217          * See original {@link Stubber#doCallRealMethod()}
218          * @since 1.9.0
219          */
willCallRealMethod()220         BDDStubber willCallRealMethod();
221 
222         /**
223          * See original {@link Stubber#when(Object)}
224          * @since 1.8.0
225          */
given(T mock)226         <T> T given(T mock);
227     }
228 
229     public static class BDDStubberImpl implements BDDStubber {
230 
231         private final Stubber mockitoStubber;
232 
BDDStubberImpl(Stubber mockitoStubber)233         public BDDStubberImpl(Stubber mockitoStubber) {
234             this.mockitoStubber = mockitoStubber;
235         }
236 
237         /* (non-Javadoc)
238          * @see BDDMockito.BDDStubber#given(java.lang.Object)
239          */
given(T mock)240         public <T> T given(T mock) {
241             return mockitoStubber.when(mock);
242         }
243 
244         /* (non-Javadoc)
245          * @see BDDMockito.BDDStubber#willAnswer(Answer)
246          */
willAnswer(Answer answer)247         public BDDStubber willAnswer(Answer answer) {
248             return new BDDStubberImpl(mockitoStubber.doAnswer(answer));
249         }
250 
251         /* (non-Javadoc)
252          * @see BDDMockito.BDDStubber#willNothing()
253          */
willNothing()254         public BDDStubber willNothing() {
255             return new BDDStubberImpl(mockitoStubber.doNothing());
256         }
257 
258         /* (non-Javadoc)
259          * @see BDDMockito.BDDStubber#willReturn(java.lang.Object)
260          */
willReturn(Object toBeReturned)261         public BDDStubber willReturn(Object toBeReturned) {
262             return new BDDStubberImpl(mockitoStubber.doReturn(toBeReturned));
263         }
264 
265         /* (non-Javadoc)
266          * @see BDDMockito.BDDStubber#willThrow(java.lang.Throwable)
267          */
willThrow(Throwable toBeThrown)268         public BDDStubber willThrow(Throwable toBeThrown) {
269             return new BDDStubberImpl(mockitoStubber.doThrow(toBeThrown));
270         }
271 
272         /* (non-Javadoc)
273          * @see BDDMockito.BDDStubber#willThrow(Class)
274          */
willThrow(Class<? extends Throwable> toBeThrown)275         public BDDStubber willThrow(Class<? extends Throwable> toBeThrown) {
276             return new BDDStubberImpl(mockitoStubber.doThrow(toBeThrown));
277         }
278 
279         /* (non-Javadoc)
280          * @see BDDMockito.BDDStubber#willCallRealMethod()
281          */
willCallRealMethod()282         public BDDStubber willCallRealMethod() {
283             return new BDDStubberImpl(mockitoStubber.doCallRealMethod());
284         }
285     }
286 
287     /**
288      * see original {@link Mockito#doThrow(Throwable)}
289      * @since 1.8.0
290      */
willThrow(Throwable toBeThrown)291     public static BDDStubber willThrow(Throwable toBeThrown) {
292         return new BDDStubberImpl(Mockito.doThrow(toBeThrown));
293     }
294 
295     /**
296      * see original {@link Mockito#doThrow(Throwable)}
297      * @since 1.9.0
298      */
willThrow(Class<? extends Throwable> toBeThrown)299     public static BDDStubber willThrow(Class<? extends Throwable> toBeThrown) {
300         return new BDDStubberImpl(Mockito.doThrow(toBeThrown));
301     }
302 
303     /**
304      * see original {@link Mockito#doAnswer(Answer)}
305      * @since 1.8.0
306      */
willAnswer(Answer answer)307     public static BDDStubber willAnswer(Answer answer) {
308         return new BDDStubberImpl(Mockito.doAnswer(answer));
309     }
310 
311     /**
312      * see original {@link Mockito#doNothing()}
313      * @since 1.8.0
314      */
willDoNothing()315     public static BDDStubber willDoNothing() {
316         return new BDDStubberImpl(Mockito.doNothing());
317     }
318 
319     /**
320      * see original {@link Mockito#doReturn(Object)}
321      * @since 1.8.0
322      */
willReturn(Object toBeReturned)323     public static BDDStubber willReturn(Object toBeReturned) {
324         return new BDDStubberImpl(Mockito.doReturn(toBeReturned));
325     }
326 
327     /**
328      * see original {@link Mockito#doCallRealMethod()}
329      * @since 1.8.0
330      */
willCallRealMethod()331     public static BDDStubber willCallRealMethod() {
332         return new BDDStubberImpl(Mockito.doCallRealMethod());
333     }
334 }
335