blob: 9cbda5d5ded7e91bb61b0d9d6cf9890bcae290e8 [file] [log] [blame]
shiqiane35fdd92008-12-10 05:08:54 +00001Google C++ Mocking Framework
2============================
3http://code.google.com/p/googlemock/
4
5Overview
6--------
7Google's framework for writing and using C++ mock classes on Linux,
8Mac OS X, and Windows. Inspired by jMock, EasyMock, and Hamcrest, and
9designed with C++'s specifics in mind, it can help you derive better
10designs of your system and write better tests.
11
12Google Mock:
13
14- provides a declarative syntax for defining mocks,
15- can easily define partial (hybrid) mocks, which are a cross of real
16 and mock objects,
17- handles functions of arbitrary types and overloaded functions,
18- comes with a rich set of matchers for validating function arguments,
19- uses an intuitive syntax for controlling the behavior of a mock,
20- does automatic verification of expectations (no record-and-replay
21 needed),
22- allows arbitrary (partial) ordering constraints on
23 function calls to be expressed,
24- lets a user extend it by defining new matchers and actions.
25- does not use exceptions, and
26- is easy to learn and use.
27
28Please see the project page above for more information as well as mailing lists
29for questions, discussions, and development. There is also an IRC channel on
30OFTC (irc.oftc.net) #gtest available. Please join us!
31
32Please note that code under scripts/generator/ is from the cppclean
33project (http://code.google.com/p/cppclean/) and under the Apache
shiqianc50af1a2008-12-11 05:22:15 +000034License, which is different from Google Mock's license.
shiqiane35fdd92008-12-10 05:08:54 +000035
36Requirements
37------------
38Google Mock is not a testing framework itself. Instead, it needs a
zhanyong.wan62417be2009-03-19 18:39:41 +000039testing framework for writing tests. It works with Google Test
40(http://code.google.com/p/googletest/) out of the box. You can use
41either the copy of Google Test that comes with Google Mock, or a
shiqian281b1d22008-12-11 00:13:55 +000042compatible version you already have. This version of Google Mock
zhanyong.wan90c90f92009-06-17 22:11:04 +000043requires Google Test 1.4.0.
shiqiane35fdd92008-12-10 05:08:54 +000044
zhanyong.wan62417be2009-03-19 18:39:41 +000045You can also easily configure Google Mock to work with another testing
46framework of your choice; although it will still need Google Test as
47an internal dependency. Please read
48http://code.google.com/p/googlemock/wiki/ForDummies#Using_Google_Mock_with_Any_Testing_Framework
49for how to do it.
50
shiqiane35fdd92008-12-10 05:08:54 +000051Google Mock depends on advanced C++ features and thus requires a more
52modern compiler. The following are needed to use Google Mock:
53
54### Linux Requirements ###
55These are the base requirements to build and use Google Mock from a source
56package (as described below):
57 * GNU-compatible Make or "gmake"
58 * POSIX-standard shell
59 * POSIX(-2) Regular Expressions (regex.h)
zhanyong.wan90c90f92009-06-17 22:11:04 +000060 * gcc 3.4 or newer.
shiqiane35fdd92008-12-10 05:08:54 +000061
62Furthermore, if you are building Google Mock from a VCS Checkout (also
63described below), there are further requirements:
64 * Automake version 1.9 or newer
65 * Autoconf version 2.59 or newer
66 * Libtool / Libtoolize
67 * Python version 2.3 or newer
68
69### Windows Requirements ###
70 * Microsoft Visual C++ 8.0 SP1 or newer
shiqiane35fdd92008-12-10 05:08:54 +000071
72### Mac OS X Requirements ###
73 * Mac OS X 10.4 Tiger or newer
74 * Developer Tools Installed
75
76Getting the Source
77------------------
78There are two primary ways of getting Google Mock's source code: you can
79download a source release in your preferred archive format, or directly check
80out the source from a Version Control System (VCS, we use Google Code's
81Subversion hosting). The VCS checkout requires a few extra steps and some extra
82software packages on your system, but lets you track development, and make
83patches to contribute much more easily, so we highly encourage it.
84
85### VCS Checkout: ###
86The first step is to select whether you want to check out the main line of
87development on Google Mock, or one of the released branches. The former will be
88much more active and have the latest features, but the latter provides much
89more stability and predictability. Choose whichever fits your needs best, and
90proceed with the following Subversion commands:
91
shiqianc50af1a2008-12-11 05:22:15 +000092 svn checkout http://googlemock.googlecode.com/svn/trunk/ gmock-svn
shiqiane35fdd92008-12-10 05:08:54 +000093
94or for a release version X.Y.*'s branch:
95
shiqianc50af1a2008-12-11 05:22:15 +000096 svn checkout http://googlemock.googlecode.com/svn/branches/release-X.Y/ \
shiqiane35fdd92008-12-10 05:08:54 +000097 gmock-X.Y-svn
98
99Next you will need to prepare the GNU Autotools build system, if you
100are using Linux or Mac OS X. Enter the target directory of the
101checkout command you used ('gmock-svn' or 'gmock-X.Y-svn' above) and
shiqian281b1d22008-12-11 00:13:55 +0000102proceed with the following command:
shiqiane35fdd92008-12-10 05:08:54 +0000103
shiqianc50af1a2008-12-11 05:22:15 +0000104 autoreconf -fvi
shiqiane35fdd92008-12-10 05:08:54 +0000105
shiqianc50af1a2008-12-11 05:22:15 +0000106Once you have completed this step, you are ready to build the library. Note
107that you should only need to complete this step once. The subsequent `make'
108invocations will automatically re-generate the bits of the build system that
109need to be changed.
shiqiane35fdd92008-12-10 05:08:54 +0000110
shiqian281b1d22008-12-11 00:13:55 +0000111If your system uses older versions of the autotools, the above command will
shiqianc50af1a2008-12-11 05:22:15 +0000112fail. You may need to explicitly specify a version to use. For instance, if you
113have both GNU Automake 1.4 and 1.9 installed and `automake' would invoke the
1141.4, use instead:
shiqian281b1d22008-12-11 00:13:55 +0000115
shiqianc50af1a2008-12-11 05:22:15 +0000116 AUTOMAKE=automake-1.9 ACLOCAL=aclocal-1.9 autoreconf -fvi
shiqian281b1d22008-12-11 00:13:55 +0000117
118Make sure you're using the same version of automake and aclocal.
shiqiane35fdd92008-12-10 05:08:54 +0000119
120### Source Package: ###
121Google Mock is also released in source packages which can be downloaded from
122its Google Code download page[1]. Several different archive formats are
shiqianc50af1a2008-12-11 05:22:15 +0000123provided, but the only difference is the tools needed to extract their
124contents, and the size of the resulting file. Download whichever you are most
125comfortable with.
shiqiane35fdd92008-12-10 05:08:54 +0000126
127 [1] Google Mock Downloads: http://code.google.com/p/googlemock/downloads/list
128
129Once downloaded expand the archive using whichever tools you prefer for that
130type. This will always result in a new directory with the name "gmock-X.Y.Z"
131which contains all of the source code. Here are some examples in Linux:
132
shiqianc50af1a2008-12-11 05:22:15 +0000133 tar -xvzf gmock-X.Y.Z.tar.gz
134 tar -xvjf gmock-X.Y.Z.tar.bz2
135 unzip gmock-X.Y.Z.zip
shiqiane35fdd92008-12-10 05:08:54 +0000136
zhanyong.wan90c90f92009-06-17 22:11:04 +0000137Choosing a TR1 Tuple Library
138----------------------------
139Google Mock uses the C++ Technical Report 1 (TR1) tuple library
140heavily. Unfortunately TR1 tuple is not yet widely available with all
141compilers. The good news is that Google Test 1.4.0+ implements a
142subset of TR1 tuple that's enough for Google Mock's need. Google Mock
143will automatically use that implementation when the compiler doesn't
144provide TR1 tuple.
145
146Usually you don't need to care about which tuple library Google Test
147and Google Mock use. However, if your project already uses TR1 tuple,
148you need to tell Google Test and Google Mock to use the same TR1 tuple
149library the rest of your project uses (this requirement is new in
150Google Test 1.4.0 and Google Mock 1.2.0, so you may need to take care
151of it when upgrading from an earlier version), or the two tuple
152implementations will clash. To do that, add
153
154 -DGTEST_USE_OWN_TR1_TUPLE=0
155
156to the compiler flags while compiling Google Test, Google Mock, and
157your tests.
158
159If you want to use Boost's TR1 tuple library with Google Mock, please
160refer to the Boost website (http://www.boost.org/) for how to obtain
161it and set it up.
162
shiqiane35fdd92008-12-10 05:08:54 +0000163Building the Source
164-------------------
165### Linux and Mac OS X (without Xcode) ###
166There are two primary options for building the source at this point: build it
167inside the source code tree, or in a separate directory. We recommend building
168in a separate directory as that tends to produce both more consistent results
169and be easier to clean up should anything go wrong, but both patterns are
170supported. The only hard restriction is that while the build directory can be
171a subdirectory of the source directory, the opposite is not possible and will
172result in errors. Once you have selected where you wish to build Google Mock,
173create the directory if necessary, and enter it. The following steps apply for
174either approach by simply substituting the shell variable SRCDIR with "." for
175building inside the source directory, and the relative path to the source
176directory otherwise.
177
shiqianc50af1a2008-12-11 05:22:15 +0000178 ${SRCDIR}/configure # Standard GNU configure script, --help for more info
179
180The default behavior of the configure script with respect to locating and using
181Google Test is to first search for a 'gtest-config' in the system path, and
182lacking this, build an internal copy of Google Test. You may optionally specify
183a custom Google Test you wish to build Google Mock against, provided it is
184a new enough version.
185
186 # Configure against an installation in '/opt' with '/opt/bin/gtest-config'.
187 ${SRCDIR}/configure --with-gtest=/opt
188
189This can also be used to specify a Google Test which hasn't yet been installed.
190However, it must have been configured and built as described in the Google Test
191README before you configure Google Mock. To enable this feature, simply pass
192the directory where you configured and built Google Test (which is not
193necessarily its source directory) to Google Mock's configure script.
194
195 # Configure against a build of Google Test in an arbitrary directory.
196 ${SRCDIR}/configure --with-gtest=../../my_gtest_build
197
198Finally, if you have a version of Google Test installed but for some reason
199wish to forcibly prevent it from being used, we provide a special option.
200Typically this is not needed as we fall back to the internal Google Test
201packaged with Google Mock if an installed version is either unavailable or too
202old to build Google Mock. When using the internally packaged Google Test, the
203user does *not* need to configure or build it, that is automatically handled by
204Google Mock's build system.
205
206 # Force the use of the internally packaged Google Test, despite
207 # 'gtest-config' being in your PATH.
208 ${SRCDIR}/configure --disable-external-gtest
209
210Once you have successfully configured Google Mock, the build steps are standard
211for GNU-style OSS packages.
212
213 make # Standard makefile following GNU conventions
214 make check # Builds and runs all tests - all should pass
shiqiane35fdd92008-12-10 05:08:54 +0000215
216Other programs will only be able to use Google Mock's functionality if you
217install it in a location which they can access, in Linux this is typically
218under '/usr/local'. The following command will install all of the Google Mock
219libraries, public headers, and utilities necessary for other programs and
shiqianc50af1a2008-12-11 05:22:15 +0000220libraries to leverage it. Note that if Google Mock was unable to find an
221external Google Test to build against, it will also install the internally
222packaged Google Test in order to allow the installed Google Mock to function
223properly. This Google Test install will be fully functional, and if installed
224will also be uninstalled by uninstalling Google Mock.
shiqiane35fdd92008-12-10 05:08:54 +0000225
shiqianc50af1a2008-12-11 05:22:15 +0000226 sudo make install # Not necessary, but allows use by other programs
shiqiane35fdd92008-12-10 05:08:54 +0000227
shiqianc50af1a2008-12-11 05:22:15 +0000228Should you need to remove Google Mock from your system after having installed
229it, run the following command, and it will back out its changes. However, note
230carefully that you must run this command on the *same* Google Mock build that
231you ran the install from, or the results are not predictable. If you install
232Google Mock on your system, and are working from a VCS checkout, make sure you
233run this *before* updating your checkout of the source in order to uninstall
234the same version which you installed.
shiqiane35fdd92008-12-10 05:08:54 +0000235
shiqianc50af1a2008-12-11 05:22:15 +0000236 sudo make uninstall # Must be run against the exact same build as "install"
shiqiane35fdd92008-12-10 05:08:54 +0000237
shiqianc50af1a2008-12-11 05:22:15 +0000238Your project can build against Google Mock and Google Test simply by leveraging
239the 'gmock-config' script. This script can be invoked directly out of the
240'scripts' subdirectory of the build tree, and it will be installed in the
241binary directory specified during the 'configure'. Here are some examples of
242its use, see 'gmock-config --help' for more detailed information.
shiqiane35fdd92008-12-10 05:08:54 +0000243
shiqianc50af1a2008-12-11 05:22:15 +0000244 gmock-config --min-version=1.0 || echo "Insufficient Google Mock version."
245
246 g++ $(gmock-config --cppflags --cxxflags) -o foo.o -c foo.cpp
247 g++ $(gmock-config --ldflags --libs) -o foo foo.o
248
249 # When using a built but not installed Google Mock:
250 g++ $(../../my_gmock_build/scripts/gmock-config ...) ...
251
252Note that when building your project against Google Mock, you are building
253against Google Test as well. There is no need to configure Google Test
254separately.
shiqiane35fdd92008-12-10 05:08:54 +0000255
256### Windows ###
shiqian44a8cf12008-12-22 23:06:35 +0000257The msvc/ directory contains VC++ 2005 projects for building Google
zhanyong.wan90c90f92009-06-17 22:11:04 +0000258Mock and selected tests.
shiqianc6cece72008-12-10 07:50:41 +0000259
260If you want to use a version of Google Test other then the one bundled with
261Google Mock, change the value of the GTestDir macro in gmock_config.vsprop
262to point to the new location.
263
zhanyong.wan90c90f92009-06-17 22:11:04 +0000264Open msvc/gmock.sln and build the library and tests. If you want to
265create your own project to use with Google Mock, you'll have to
266configure it to use the gmock_config propety sheet. For that:
shiqianc50af1a2008-12-11 05:22:15 +0000267 * Open the Property Manager window (View | Other Windows | Property Manager)
shiqianc6cece72008-12-10 07:50:41 +0000268 * Right-click on your project and select "Add Existing Property Sheet..."
269 * Navigate to gmock_config.vsprops and select it.
shiqianc50af1a2008-12-11 05:22:15 +0000270 * In Project Properties | Configuration Properties | General | Additional
271 Include Directories, type <path to Google Mock>/include.
272
273TODO(wan@google.com): update the .vsprops and .vcproj files such that the
274last step is unnecessary.
shiqiane35fdd92008-12-10 05:08:54 +0000275
276### Using GNU Make ###
277The make/ directory contains a Makefile that you can use to build
278Google Mock on systems where GNU make is available (e.g. Linux and Mac
279OS X). It doesn't try to build Google Mock's own tests. Instead, it
280just builds the Google Mock libraries and some sample tests. You can
281use it as a starting point for your own Makefile.
282
283If the default settings are correct for your environment, the
284following commands should succeed:
285
shiqianc50af1a2008-12-11 05:22:15 +0000286 cd ${SRCDIR}/make
287 make
288 ./gmock_test
shiqiane35fdd92008-12-10 05:08:54 +0000289
290If you see errors, try to tweak the contents of make/Makefile to make
291them go away. There are instructions in make/Makefile on how to do
292it.
293
294### Using Your Own Build System ###
295If none of the build solutions we provide works for you, or if you
296prefer your own build system, you just need to compile
297${GTEST_SRCDIR}/src/gtest-all.cc (where GTEST_SRCDIR is the root of
298the Google Test source tree) and src/gmock-all.cc into a library and
299link your tests with it. Assuming a Linux-like system and gcc,
300something like the following will do:
301
shiqianc50af1a2008-12-11 05:22:15 +0000302 cd ${SRCDIR}
303 g++ -I. -I./include -I${GTEST_SRCDIR} -I${GTEST_SRCDIR}/include \
shiqiane35fdd92008-12-10 05:08:54 +0000304 -c {GTEST_SRCDIR}/src/gtest-all.cc
shiqianc50af1a2008-12-11 05:22:15 +0000305 g++ -I. -I./include -I${GTEST_SRCDIR} -I${GTEST_SRCDIR}/include \
shiqiane35fdd92008-12-10 05:08:54 +0000306 -c src/gmock-all.cc
shiqianc50af1a2008-12-11 05:22:15 +0000307 ar -rv libgmock.a gtest-all.o gmock-all.o
308 g++ -I. -I./include -I${GTEST_SRCDIR} -I${GTEST_SRCDIR}/include \
shiqiane35fdd92008-12-10 05:08:54 +0000309 path/to/your_test.cc libgmock.a -o your_test
310
shiqiane35fdd92008-12-10 05:08:54 +0000311Regenerating Source Files
312-------------------------
313Some of Google Mock's source files are generated from templates (not
314in the C++ sense) using a script. A template file is named FOO.pump,
315where FOO is the name of the file it will generate. For example, the
316file include/gmock/gmock-generated-actions.h.pump is used to generate
317gmock-generated-actions.h in the same directory.
318
319Normally you don't need to worry about regenerating the source files,
320unless you need to modify them (e.g. if you are working on a patch for
321Google Mock). In that case, you should modify the corresponding .pump
322files instead and run the 'pump' script (for Pump is Useful for Meta
323Programming) to regenerate them. We are still working on releasing
324the script and its documentation. If you need it now, please email
325googlemock@googlegroups.com such that we know to make it happen
326sooner.
327
328Happy testing!