1 /**
2 * Redistribution and use in source and binary forms, with or without
3 * modification, are permitted provided that the following conditions are
4 * met :
5 *
6 * . Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 *
9 * . Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * . The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 package cpptools;
30
31 import java.util.ArrayList;
32 import java.util.List;
33 import junit.framework.TestCase;
34 import org.easymock.classextension.EasyMock;
35
36 /**
37 * Extends a JUnit TestCase with several EasyMock related features.
38 * <p>
39 * This extension provides the following benefits :
40 * <ul>
41 * <li>supports interface and concrete classes through the same creation method
42 * <li>resets all expectations before each test
43 * <li>verifies all expectations after each test
44 * <li>provides helper methods to reset, replay or verify all control objects at once
45 * </ul>
46 * <p>
47 * As a consequence the tests are easier to write and end up being simpler.
48 * <p>
49 * TODO add nice and strict mock support
50 *
51 * @see <a href="http://junit.org">JUnit</a>
52 * @see <a href="http://easymock.org">EasyMock</a>
53 * @author Mathieu Champlon
54 */
55 public class EasyMockTestCase extends TestCase
56 {
57 /**
58 * The mock objects.
59 */
60 private final List<Object> mocks = new ArrayList<Object>();
61 /**
62 * Whether a forced replay is needed before verifying all controls.
63 */
64 private boolean mustForceReplay = true;
65
66 /**
67 * {@inheritDoc}
68 */
69 public final void runBare() throws Throwable
70 {
71 try
72 {
73 setUp();
74 reset();
75 try
76 {
77 runTest();
78 }
79 finally
80 {
81 tearDown();
82 }
83 if( mustForceReplay )
84 replay();
85 verify();
86 }
87 finally
88 {
89 mocks.clear();
90 mustForceReplay = true;
91 }
92 }
93
94 /**
95 * Factory method to create a mock object of a given type.
96 *
97 * @param <T> the type of the created mock object
98 * @param type the type of the mock object to create
99 * @return the created mock object
100 */
101 protected final <T> T createMock( final Class<T> type )
102 {
103 final T mock = EasyMock.createMock( type );
104 mocks.add( mock );
105 return mock;
106 }
107
108 /**
109 * Reset all mock objects expectations.
110 * <p>
111 * The state of mock objects is then the same as at the beginning of the test.
112 */
113 protected final void reset()
114 {
115 mustForceReplay = true;
116 for( Object mock : mocks )
117 EasyMock.reset( mock );
118 }
119
120 /**
121 * Set all mock objects to replay mode.
122 */
123 protected final void replay()
124 {
125 mustForceReplay = false;
126 for( Object mock : mocks )
127 EasyMock.replay( mock );
128 }
129
130 /**
131 * Verify all mock objects expectations.
132 * <p>
133 * This method is automatically called at the end of each test.
134 */
135 protected final void verify()
136 {
137 for( Object mock : mocks )
138 EasyMock.verify( mock );
139 }
140
141 /**
142 * This method serves no purpose but to deactivate the JUnit warning "No tests found in tools.EasyMockTestCase".
143 */
144 public final void testMethodToRemoveJUnitWarningAboutMissingTests()
145 {
146 }
147 }