• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2001-2009 OFFIS, Tammo Freese
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.easymock;
17 
18 import static org.easymock.EasyMock.*;
19 
20 import java.io.Serializable;
21 
22 import org.easymock.internal.*;
23 
24 /**
25  * A <code>MockControl</code> object controls the behavior of its associated
26  * mock object. For more information, see the EasyMock documentation.
27  *
28  * @param <T> type of the mock controlled
29  *
30  * @deprecated Since EasyMock 2.0, static methods on <code>EasyMock</code> are
31  * used to create and control mock objects.
32  */
33 @Deprecated
34 public class MockControl<T> implements Serializable {
35 
36     private static final long serialVersionUID = 8741244302173698092L;
37 
38     private final T mock;
39 
40     private final MocksControl ctrl;
41 
MockControl(MocksControl ctrl, Class<T> toMock)42     protected MockControl(MocksControl ctrl, Class<T> toMock) {
43         this.ctrl = ctrl;
44         this.mock = ctrl.createMock(toMock);
45     }
46 
47     /**
48      * Creates a mock control object for the specified interface. The
49      * <code>MockControl</code> and its associated mock object will not check
50      * the order of expected method calls. An unexpected method call on the mock
51      * object will lead to an <code>AssertionError</code>.
52      *
53      * @param <T> type of the mock controlled
54      * @param toMock
55      *            the class of the interface to mock.
56      * @return the mock control.
57      */
createControl(Class<T> toMock)58     public static <T> MockControl<T> createControl(Class<T> toMock) {
59         return new MockControl<T>((MocksControl) EasyMock.createControl(),
60                 toMock);
61     }
62 
63     /**
64      * Creates a mock control object for the specified interface. The
65      * <code>MockControl</code> and its associated mock object will check the
66      * order of expected method calls. An unexpected method call on the mock
67      * object will lead to an <code>AssertionError</code>.
68      *
69      * @param <T> type of the mock controlled
70      * @param toMock
71      *            the class of the interface to mock.
72      * @return the mock control.
73      */
createStrictControl(Class<T> toMock)74     public static <T> MockControl<T> createStrictControl(Class<T> toMock) {
75         return new MockControl<T>(
76                 (MocksControl) EasyMock.createStrictControl(), toMock);
77     }
78 
79     /**
80      * Creates a mock control object for the specified interface. The
81      * <code>MockControl</code> and its associated mock object will not check
82      * the order of expected method calls. An unexpected method call on the mock
83      * object will return an empty value (0, null, false).
84      *
85      * @param <T> type of the mock controlled
86      * @param toMock
87      *            the class of the interface to mock.
88      * @return the mock control.
89      */
createNiceControl(Class<T> toMock)90     public static <T> MockControl<T> createNiceControl(Class<T> toMock) {
91         return new MockControl<T>((MocksControl) EasyMock.createNiceControl(),
92                 toMock);
93     }
94 
95     /**
96      * Returns the mock object.
97      *
98      * @return the mock object of this control
99      */
getMock()100     public T getMock() {
101         return mock;
102     }
103 
104     /**
105      * Resets the mock control and the mock object to the state directly after
106      * creation.
107      */
reset()108     public final void reset() {
109         ctrl.reset();
110     }
111 
112     /**
113      * Switches the mock object from record state to replay state. For more
114      * information, see the EasyMock documentation.
115      *
116      * @throws IllegalStateException
117      *             if the mock object already is in replay state.
118      */
replay()119     public void replay() {
120         ctrl.replay();
121     }
122 
123     /**
124      * Verifies that all expectations have been met. For more information, see
125      * the EasyMock documentation.
126      *
127      * @throws IllegalStateException
128      *             if the mock object is in record state.
129      * @throws AssertionError
130      *             if any expectation has not been met.
131      */
verify()132     public void verify() {
133         ctrl.verify();
134     }
135 
136     /**
137      * Records that the mock object will expect the last method call once, and
138      * will react by returning silently.
139      *
140      * @exception IllegalStateException
141      *                if the mock object is in replay state, if no method was
142      *                called on the mock object before, or if the last method
143      *                called on the mock was no void method.
144      */
setVoidCallable()145     public void setVoidCallable() {
146         expectLastCall(
147                 "method call on the mock needed before setting void callable")
148                 .once();
149     }
150 
151     /**
152      * Records that the mock object will expect the last method call once, and
153      * will react by throwing the provided Throwable.
154      *
155      * @param throwable
156      *            the Throwable to throw.
157      * @exception IllegalStateException
158      *                if the mock object is in replay state or if no method was
159      *                called on the mock object before.
160      * @exception IllegalArgumentException
161      *                if the last method called on the mock cannot throw the
162      *                provided Throwable.
163      * @exception NullPointerException
164      *                if throwable is null.
165      */
setThrowable(Throwable throwable)166     public void setThrowable(Throwable throwable) {
167         expectLastCall(
168                 "method call on the mock needed before setting Throwable")
169                 .andThrow(throwable).once();
170     }
171 
172     /**
173      * Records that the mock object will expect the last method call once, and
174      * will react by returning the provided return value.
175      *
176      * @param value
177      *            the return value.
178      * @throws IllegalStateException
179      *             if the mock object is in replay state, if no method was
180      *             called on the mock object before. or if the last method
181      *             called on the mock does not return <code>boolean</code>.
182      */
setReturnValue(Object value)183     public void setReturnValue(Object value) {
184         expectLastCall(
185                 "method call on the mock needed before setting return value")
186                 .andReturn(value).once();
187     }
188 
189     /**
190      * Records that the mock object will expect the last method call a fixed
191      * number of times, and will react by returning silently.
192      *
193      * @param times
194      *            the number of times that the call is expected.
195      * @exception IllegalStateException
196      *                if the mock object is in replay state, if no method was
197      *                called on the mock object before, or if the last method
198      *                called on the mock was no void method.
199      */
setVoidCallable(int times)200     public void setVoidCallable(int times) {
201         expectLastCall(
202                 "method call on the mock needed before setting void callable")
203                 .times(times);
204     }
205 
206     /**
207      * Records that the mock object will expect the last method call a fixed
208      * number of times, and will react by throwing the provided Throwable.
209      *
210      * @param throwable
211      *            the Throwable to throw.
212      * @param times
213      *            the number of times that the call is expected.
214      * @exception IllegalStateException
215      *                if the mock object is in replay state or if no method was
216      *                called on the mock object before.
217      * @exception IllegalArgumentException
218      *                if the last method called on the mock cannot throw the
219      *                provided Throwable.
220      * @exception NullPointerException
221      *                if throwable is null.
222      */
setThrowable(Throwable throwable, int times)223     public void setThrowable(Throwable throwable, int times) {
224         expectLastCall(
225                 "method call on the mock needed before setting Throwable")
226                 .andThrow(throwable).times(times);
227     }
228 
229     /**
230      * Records that the mock object will expect the last method call a fixed
231      * number of times, and will react by returning the provided return value.
232      *
233      * @param value
234      *            the return value.
235      * @param times
236      *            the number of times that the call is expected.
237      * @throws IllegalStateException
238      *             if the mock object is in replay state, if no method was
239      *             called on the mock object before. or if the last method
240      *             called on the mock does not return <code>boolean</code>.
241      */
setReturnValue(Object value, int times)242     public void setReturnValue(Object value, int times) {
243         expectLastCall(
244                 "method call on the mock needed before setting return value")
245                 .andReturn(value).times(times);
246     }
247 
248     /**
249      * Records that the mock object will expect the last method call a fixed
250      * number of times, and will react by returning the provided return value.
251      *
252      * @param value
253      *            the return value.
254      * @param range
255      *            the number of times that the call is expected.
256      * @throws IllegalStateException
257      *             if the mock object is in replay state, if no method was
258      *             called on the mock object before. or if the last method
259      *             called on the mock does not return <code>boolean</code>.
260      */
setReturnValue(Object value, Range range)261     public void setReturnValue(Object value, Range range) {
262         IExpectationSetters<Object> setter = expectLastCall(
263                 "method call on the mock needed before setting return value")
264                 .andReturn(value);
265         callWithConvertedRange(setter, range);
266     }
267 
268     /**
269      * Records that the mock object will by default allow the last method
270      * specified by a method call.
271      *
272      * @exception IllegalStateException
273      *                if the mock object is in replay state, if no method was
274      *                called on the mock object before, or if the last method
275      *                called on the mock was no void method.
276      */
setDefaultVoidCallable()277     public void setDefaultVoidCallable() {
278         ((MocksControl) expectLastCall("method call on the mock needed before setting default void callable"))
279                 .setLegacyDefaultVoidCallable();
280     }
281 
282     /**
283      * Records that the mock object will by default allow the last method
284      * specified by a method call, and will react by throwing the provided
285      * Throwable.
286      *
287      * @param throwable
288      *            throwable the throwable to be thrown
289      * @exception IllegalArgumentException
290      *                if the last method called on the mock cannot throw the
291      *                provided Throwable.
292      * @exception NullPointerException
293      *                if throwable is null.
294      * @exception IllegalStateException
295      *                if the mock object is in replay state, or if no method was
296      *                called on the mock object before.
297      */
setDefaultThrowable(Throwable throwable)298     public void setDefaultThrowable(Throwable throwable) {
299         ctrl.setLegacyDefaultThrowable(throwable);
300     }
301 
302     /**
303      * Records that the mock object will by default allow the last method
304      * specified by a method call, and will react by returning the provided
305      * return value.
306      *
307      * @param value
308      *            the return value.
309      * @throws IllegalStateException
310      *             if the mock object is in replay state, if no method was
311      *             called on the mock object before. or if the last method
312      *             called on the mock does not return <code>boolean</code>.
313      */
setDefaultReturnValue(Object value)314     public void setDefaultReturnValue(Object value) {
315         ctrl.setLegacyDefaultReturnValue(value);
316     }
317 
318     /**
319      * Sets the ArgumentsMatcher for the last method called on the mock object.
320      * The matcher must be set before any behavior for the method is defined.
321      *
322      * @param matcher the matcher for the last method called
323      * @throws IllegalStateException
324      *             if called in replay state, or if no method was called on the
325      *             mock object before.
326      */
setMatcher(ArgumentsMatcher matcher)327     public void setMatcher(ArgumentsMatcher matcher) {
328         ctrl.setLegacyMatcher(matcher);
329     }
330 
331     /**
332      * Records that the mock object will expect the last method call between
333      * <code>minCount</code> and <code>maxCount</code> times, and will react
334      * by returning silently.
335      *
336      * @param minCount
337      *            the minimum number of times that the call is expected.
338      * @param maxCount
339      *            the maximum number of times that the call is expected.
340      * @exception IllegalStateException
341      *                if the mock object is in replay state, if no method was
342      *                called on the mock object before, or if the last method
343      *                called on the mock was no void method.
344      */
setVoidCallable(int minCount, int maxCount)345     public void setVoidCallable(int minCount, int maxCount) {
346         expectLastCall(
347                 "method call on the mock needed before setting void callable")
348                 .times(minCount, maxCount);
349     }
350 
setVoidCallable(Range range)351     public void setVoidCallable(Range range) {
352         IExpectationSetters<Object> setter = expectLastCall("method call on the mock needed before setting void callable");
353         callWithConvertedRange(setter, range);
354     }
355 
356     /**
357      * Records that the mock object will expect the last method call between
358      * <code>minCount</code> and <code>maxCount</code> times, and will react
359      * by throwing the provided Throwable.
360      *
361      * @param throwable
362      *            the Throwable to throw.
363      * @param minCount
364      *            the minimum number of times that the call is expected.
365      * @param maxCount
366      *            the maximum number of times that the call is expected.
367      * @exception IllegalStateException
368      *                if the mock object is in replay state or if no method was
369      *                called on the mock object before.
370      * @exception IllegalArgumentException
371      *                if the last method called on the mock cannot throw the
372      *                provided Throwable.
373      * @exception NullPointerException
374      *                if throwable is null.
375      */
setThrowable(Throwable throwable, int minCount, int maxCount)376     public void setThrowable(Throwable throwable, int minCount, int maxCount) {
377         expectLastCall(
378                 "method call on the mock needed before setting Throwable")
379                 .andThrow(throwable).times(minCount, maxCount);
380     }
381 
setThrowable(Throwable throwable, Range range)382     public void setThrowable(Throwable throwable, Range range) {
383         IExpectationSetters<Object> setter = expectLastCall(
384                 "method call on the mock needed before setting Throwable")
385                 .andThrow(throwable);
386         callWithConvertedRange(setter, range);
387     }
388 
389     /**
390      * Records that the mock object will expect the last method call between
391      * <code>minCount</code> and <code>maxCount</code> times, and will react
392      * by returning the provided return value.
393      *
394      * @param value
395      *            the return value.
396      * @param minCount
397      *            the minimum number of times that the call is expected.
398      * @param maxCount
399      *            the maximum number of times that the call is expected.
400      * @throws IllegalStateException
401      *             if the mock object is in replay state, if no method was
402      *             called on the mock object before. or if the last method
403      *             called on the mock does not return <code>boolean</code>.
404      */
setReturnValue(Object value, int minCount, int maxCount)405     public void setReturnValue(Object value, int minCount, int maxCount) {
406         expectLastCall(
407                 "method call on the mock needed before setting return value")
408                 .andReturn(value).times(minCount, maxCount);
409     }
410 
411     /**
412      * Exactly one call.
413      */
414     public static final Range ONE = MocksControl.ONCE;
415 
416     /**
417      * One or more calls.
418      */
419     public static final Range ONE_OR_MORE = MocksControl.AT_LEAST_ONCE;
420 
421     /**
422      * Zero or more calls.
423      */
424     public static final Range ZERO_OR_MORE = MocksControl.ZERO_OR_MORE;
425 
426     /**
427      * Matches if each expected argument is equal to the corresponding actual
428      * argument.
429      */
430     public static final ArgumentsMatcher EQUALS_MATCHER = new EqualsMatcher();
431 
432     /**
433      * Matches always.
434      */
435     public static final ArgumentsMatcher ALWAYS_MATCHER = new AlwaysMatcher();
436 
437     /**
438      * Matches if each expected argument is equal to the corresponding actual
439      * argument for non-array arguments; array arguments are compared with the
440      * appropriate <code>java.util.Arrays.equals()</code> -method.
441      */
442     public static final ArgumentsMatcher ARRAY_MATCHER = new ArrayMatcher();
443 
444     /**
445      * Sets the default ArgumentsMatcher for all methods of the mock object. The
446      * matcher must be set before any behavior is defined on the mock object.
447      *
448      * @param matcher the default matcher for this control
449      * @throws IllegalStateException
450      *             if called in replay state, or if any behavior is already
451      *             defined on the mock object.
452      */
setDefaultMatcher(ArgumentsMatcher matcher)453     public void setDefaultMatcher(ArgumentsMatcher matcher) {
454         ctrl.setLegacyDefaultMatcher(matcher);
455     }
456 
457     /**
458      * Same as {@link MockControl#setReturnValue(Object)}. For explanation, see
459      * "Convenience Methods for Return Values" in the EasyMock documentation.
460      *
461      * @param <V1> mocked method return type
462      * @param <V2> returned value type
463      * @param ignored
464      *            an ignored value.
465      * @param value value returned by the mock
466      */
expectAndReturn(V1 ignored, V2 value)467     public <V1, V2 extends V1> void expectAndReturn(V1 ignored, V2 value) {
468         EasyMock.expectLastCall().andReturn(value).once();
469     }
470 
expectAndReturn(int ignored, int value)471     public void expectAndReturn(int ignored, int value) {
472         this.expectAndReturn((Object) ignored, (Object) value);
473     }
474 
475     /**
476      * Same as {@link MockControl#setReturnValue(Object, Range)}. For
477      * explanation, see "Convenience Methods for Return Values" in the EasyMock
478      * documentation.
479      *
480      * @param <V1> mocked method return type
481      * @param <V2> returned value type
482      * @param ignored
483      *            an ignored value.
484      * @param value value returned by the mock
485      * @param range range of number of calls
486      */
expectAndReturn(V1 ignored, V2 value, Range range)487     public <V1, V2 extends V1> void expectAndReturn(V1 ignored, V2 value,
488             Range range) {
489         IExpectationSetters<Object> expectAndReturn = EasyMock.expectLastCall()
490                 .andReturn(value);
491         callWithConvertedRange(expectAndReturn, range);
492     }
493 
expectAndReturn(int ignored, int value, Range range)494     public void expectAndReturn(int ignored, int value, Range range) {
495         this.expectAndReturn((Object) ignored, (Object) value, range);
496     }
497 
498     /**
499      * Same as {@link MockControl#setReturnValue(Object, int)}. For
500      * explanation, see "Convenience Methods for Return Values" in the EasyMock
501      * documentation.
502      *
503      * @param <V1> mocked method return type
504      * @param <V2> returned value type
505      * @param ignored
506      *            an ignored value.
507      * @param value value returned by the mock
508      * @param count number of times the call is expected
509      */
expectAndReturn(V1 ignored, V2 value, int count)510     public <V1, V2 extends V1> void expectAndReturn(V1 ignored, V2 value,
511             int count) {
512         EasyMock.expectLastCall().andReturn(value).times(count);
513     }
514 
expectAndReturn(int ignored, int value, int count)515     public void expectAndReturn(int ignored, int value, int count) {
516         this.expectAndReturn((Object) ignored, (Object) value, count);
517     }
518 
519     /**
520      * Same as {@link MockControl#setReturnValue(Object, int, int)}. For
521      * explanation, see "Convenience Methods for Return Values" in the EasyMock
522      * documentation.
523      *
524      * @param <V1> mocked method return type
525      * @param <V2> returned value type
526      * @param ignored
527      *            an ignored value.
528      * @param value value returned by the mock
529      * @param min minimum number of times the call is expected
530      * @param max maximum number of times the call is expected
531      */
expectAndReturn(V1 ignored, V2 value, int min, int max)532     public <V1, V2 extends V1> void expectAndReturn(V1 ignored, V2 value,
533             int min, int max) {
534         EasyMock.expectLastCall().andReturn(value).times(min, max);
535     }
536 
expectAndReturn(int ignored, int value, int min, int max)537     public void expectAndReturn(int ignored, int value, int min, int max) {
538         this.expectAndReturn((Object) ignored, (Object) value, min, max);
539     }
540 
541     /**
542      * Same as {@link MockControl#setThrowable(Throwable)}. For explanation,
543      * see "Convenience Methods for Throwables" in the EasyMock documentation.
544      *
545      * @param ignored
546      *            an ignored value.
547      * @param throwable to be thrown on the call
548      */
expectAndThrow(Object ignored, Throwable throwable)549     public void expectAndThrow(Object ignored, Throwable throwable) {
550         EasyMock.expect(ignored).andThrow(throwable).once();
551     }
552 
553     /**
554      * Same as {@link MockControl#setThrowable(Throwable, Range)}. For
555      * explanation, see "Convenience Methods for Throwables" in the EasyMock
556      * documentation.
557      *
558      * @param ignored
559      *            an ignored value.
560      * @param throwable to be thrown on the call
561      * @param range range of number of calls
562      */
expectAndThrow(Object ignored, Throwable throwable, Range range)563     public void expectAndThrow(Object ignored, Throwable throwable, Range range) {
564         IExpectationSetters<Object> setter = EasyMock.expect(ignored).andThrow(
565                 throwable);
566         callWithConvertedRange(setter, range);
567     }
568 
569     /**
570      * Same as {@link MockControl#setThrowable(Throwable, int)}. For
571      * explanation, see "Convenience Methods for Throwables" in the EasyMock
572      * documentation.
573      *
574      * @param ignored
575      *            an ignored value.
576      * @param throwable to be thrown on the call
577      * @param count number of times the call is expected
578      */
expectAndThrow(Object ignored, Throwable throwable, int count)579     public void expectAndThrow(Object ignored, Throwable throwable, int count) {
580         expect(ignored).andThrow(throwable).times(count);
581     }
582 
583     /**
584      * Same as {@link MockControl#setThrowable(Throwable, int, int)}. For
585      * explanation, see "Convenience Methods for Throwables" in the EasyMock
586      * documentation.
587      *
588      * @param ignored
589      *            an ignored value.
590      * @param throwable to be thrown on the call
591      * @param min minimum number of times the call is expected
592      * @param max maximum number of times the call is expected
593      */
expectAndThrow(Object ignored, Throwable throwable, int min, int max)594     public void expectAndThrow(Object ignored, Throwable throwable, int min,
595             int max) {
596         expect(ignored).andThrow(throwable).times(min, max);
597     }
598 
599     /**
600      * Same as {@link MockControl#setDefaultReturnValue(Object)}. For
601      * explanation, see "Convenience Methods for Return Values" in the EasyMock
602      * documentation.
603      *
604      * @param <V1> mocked method return type
605      * @param <V2> returned value type
606      * @param ignored
607      *            an ignored value.
608      * @param value value returned by the mock
609      */
expectAndDefaultReturn(V1 ignored, V2 value)610     public <V1, V2 extends V1> void expectAndDefaultReturn(V1 ignored, V2 value) {
611         EasyMock.expectLastCall().andStubReturn(value);
612     }
613 
614     /**
615      * Same as {@link MockControl#setDefaultThrowable(Throwable)}. For
616      * explanation, see "Convenience Methods for Throwables" in the EasyMock
617      * documentation.
618      *
619      * @param ignored
620      *            an ignored value.
621      * @param throwable to be thrown on the call
622      */
expectAndDefaultThrow(Object ignored, Throwable throwable)623     public void expectAndDefaultThrow(Object ignored, Throwable throwable) {
624         expectLastCall(
625                 "method call on the mock needed before setting default Throwable")
626                 .andStubThrow(throwable);
627     }
628 
expectLastCall(String failureMessage)629     private IExpectationSetters<Object> expectLastCall(String failureMessage) {
630         try {
631             return EasyMock.expectLastCall();
632         } catch (IllegalStateException e) {
633             throw new IllegalStateException(failureMessage);
634         }
635     }
636 
callWithConvertedRange(IExpectationSetters<Object> setter, Range range)637     private void callWithConvertedRange(IExpectationSetters<Object> setter, Range range) {
638         if (range == ONE) {
639             setter.once();
640         } else if (range == ONE_OR_MORE) {
641             setter.atLeastOnce();
642         } else if (range == ZERO_OR_MORE) {
643             setter.anyTimes();
644         } else {
645             throw new IllegalArgumentException("Unexpected Range");
646         }
647     }
648 
649 }