xref: /aosp_15_r20/external/googletest/docs/gmock_cheat_sheet.md (revision 481dde660366d6f317d242b6974ef1b20adb843c)
1*481dde66SAndroid Build Coastguard Worker# gMock Cheat Sheet
2*481dde66SAndroid Build Coastguard Worker
3*481dde66SAndroid Build Coastguard Worker## Defining a Mock Class
4*481dde66SAndroid Build Coastguard Worker
5*481dde66SAndroid Build Coastguard Worker### Mocking a Normal Class {#MockClass}
6*481dde66SAndroid Build Coastguard Worker
7*481dde66SAndroid Build Coastguard WorkerGiven
8*481dde66SAndroid Build Coastguard Worker
9*481dde66SAndroid Build Coastguard Worker```cpp
10*481dde66SAndroid Build Coastguard Workerclass Foo {
11*481dde66SAndroid Build Coastguard Worker public:
12*481dde66SAndroid Build Coastguard Worker  virtual ~Foo();
13*481dde66SAndroid Build Coastguard Worker  virtual int GetSize() const = 0;
14*481dde66SAndroid Build Coastguard Worker  virtual string Describe(const char* name) = 0;
15*481dde66SAndroid Build Coastguard Worker  virtual string Describe(int type) = 0;
16*481dde66SAndroid Build Coastguard Worker  virtual bool Process(Bar elem, int count) = 0;
17*481dde66SAndroid Build Coastguard Worker};
18*481dde66SAndroid Build Coastguard Worker```
19*481dde66SAndroid Build Coastguard Worker
20*481dde66SAndroid Build Coastguard Worker(note that `~Foo()` **must** be virtual) we can define its mock as
21*481dde66SAndroid Build Coastguard Worker
22*481dde66SAndroid Build Coastguard Worker```cpp
23*481dde66SAndroid Build Coastguard Worker#include <gmock/gmock.h>
24*481dde66SAndroid Build Coastguard Worker
25*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo {
26*481dde66SAndroid Build Coastguard Worker public:
27*481dde66SAndroid Build Coastguard Worker  MOCK_METHOD(int, GetSize, (), (const, override));
28*481dde66SAndroid Build Coastguard Worker  MOCK_METHOD(string, Describe, (const char* name), (override));
29*481dde66SAndroid Build Coastguard Worker  MOCK_METHOD(string, Describe, (int type), (override));
30*481dde66SAndroid Build Coastguard Worker  MOCK_METHOD(bool, Process, (Bar elem, int count), (override));
31*481dde66SAndroid Build Coastguard Worker};
32*481dde66SAndroid Build Coastguard Worker```
33*481dde66SAndroid Build Coastguard Worker
34*481dde66SAndroid Build Coastguard WorkerTo create a "nice" mock, which ignores all uninteresting calls, a "naggy" mock,
35*481dde66SAndroid Build Coastguard Workerwhich warns on all uninteresting calls, or a "strict" mock, which treats them as
36*481dde66SAndroid Build Coastguard Workerfailures:
37*481dde66SAndroid Build Coastguard Worker
38*481dde66SAndroid Build Coastguard Worker```cpp
39*481dde66SAndroid Build Coastguard Workerusing ::testing::NiceMock;
40*481dde66SAndroid Build Coastguard Workerusing ::testing::NaggyMock;
41*481dde66SAndroid Build Coastguard Workerusing ::testing::StrictMock;
42*481dde66SAndroid Build Coastguard Worker
43*481dde66SAndroid Build Coastguard WorkerNiceMock<MockFoo> nice_foo;      // The type is a subclass of MockFoo.
44*481dde66SAndroid Build Coastguard WorkerNaggyMock<MockFoo> naggy_foo;    // The type is a subclass of MockFoo.
45*481dde66SAndroid Build Coastguard WorkerStrictMock<MockFoo> strict_foo;  // The type is a subclass of MockFoo.
46*481dde66SAndroid Build Coastguard Worker```
47*481dde66SAndroid Build Coastguard Worker
48*481dde66SAndroid Build Coastguard Worker{: .callout .note}
49*481dde66SAndroid Build Coastguard Worker**Note:** A mock object is currently naggy by default. We may make it nice by
50*481dde66SAndroid Build Coastguard Workerdefault in the future.
51*481dde66SAndroid Build Coastguard Worker
52*481dde66SAndroid Build Coastguard Worker### Mocking a Class Template {#MockTemplate}
53*481dde66SAndroid Build Coastguard Worker
54*481dde66SAndroid Build Coastguard WorkerClass templates can be mocked just like any class.
55*481dde66SAndroid Build Coastguard Worker
56*481dde66SAndroid Build Coastguard WorkerTo mock
57*481dde66SAndroid Build Coastguard Worker
58*481dde66SAndroid Build Coastguard Worker```cpp
59*481dde66SAndroid Build Coastguard Workertemplate <typename Elem>
60*481dde66SAndroid Build Coastguard Workerclass StackInterface {
61*481dde66SAndroid Build Coastguard Worker public:
62*481dde66SAndroid Build Coastguard Worker  virtual ~StackInterface();
63*481dde66SAndroid Build Coastguard Worker  virtual int GetSize() const = 0;
64*481dde66SAndroid Build Coastguard Worker  virtual void Push(const Elem& x) = 0;
65*481dde66SAndroid Build Coastguard Worker};
66*481dde66SAndroid Build Coastguard Worker```
67*481dde66SAndroid Build Coastguard Worker
68*481dde66SAndroid Build Coastguard Worker(note that all member functions that are mocked, including `~StackInterface()`
69*481dde66SAndroid Build Coastguard Worker**must** be virtual).
70*481dde66SAndroid Build Coastguard Worker
71*481dde66SAndroid Build Coastguard Worker```cpp
72*481dde66SAndroid Build Coastguard Workertemplate <typename Elem>
73*481dde66SAndroid Build Coastguard Workerclass MockStack : public StackInterface<Elem> {
74*481dde66SAndroid Build Coastguard Worker public:
75*481dde66SAndroid Build Coastguard Worker  MOCK_METHOD(int, GetSize, (), (const, override));
76*481dde66SAndroid Build Coastguard Worker  MOCK_METHOD(void, Push, (const Elem& x), (override));
77*481dde66SAndroid Build Coastguard Worker};
78*481dde66SAndroid Build Coastguard Worker```
79*481dde66SAndroid Build Coastguard Worker
80*481dde66SAndroid Build Coastguard Worker### Specifying Calling Conventions for Mock Functions
81*481dde66SAndroid Build Coastguard Worker
82*481dde66SAndroid Build Coastguard WorkerIf your mock function doesn't use the default calling convention, you can
83*481dde66SAndroid Build Coastguard Workerspecify it by adding `Calltype(convention)` to `MOCK_METHOD`'s 4th parameter.
84*481dde66SAndroid Build Coastguard WorkerFor example,
85*481dde66SAndroid Build Coastguard Worker
86*481dde66SAndroid Build Coastguard Worker```cpp
87*481dde66SAndroid Build Coastguard Worker  MOCK_METHOD(bool, Foo, (int n), (Calltype(STDMETHODCALLTYPE)));
88*481dde66SAndroid Build Coastguard Worker  MOCK_METHOD(int, Bar, (double x, double y),
89*481dde66SAndroid Build Coastguard Worker              (const, Calltype(STDMETHODCALLTYPE)));
90*481dde66SAndroid Build Coastguard Worker```
91*481dde66SAndroid Build Coastguard Worker
92*481dde66SAndroid Build Coastguard Workerwhere `STDMETHODCALLTYPE` is defined by `<objbase.h>` on Windows.
93*481dde66SAndroid Build Coastguard Worker
94*481dde66SAndroid Build Coastguard Worker## Using Mocks in Tests {#UsingMocks}
95*481dde66SAndroid Build Coastguard Worker
96*481dde66SAndroid Build Coastguard WorkerThe typical work flow is:
97*481dde66SAndroid Build Coastguard Worker
98*481dde66SAndroid Build Coastguard Worker1.  Import the gMock names you need to use. All gMock symbols are in the
99*481dde66SAndroid Build Coastguard Worker    `testing` namespace unless they are macros or otherwise noted.
100*481dde66SAndroid Build Coastguard Worker2.  Create the mock objects.
101*481dde66SAndroid Build Coastguard Worker3.  Optionally, set the default actions of the mock objects.
102*481dde66SAndroid Build Coastguard Worker4.  Set your expectations on the mock objects (How will they be called? What
103*481dde66SAndroid Build Coastguard Worker    will they do?).
104*481dde66SAndroid Build Coastguard Worker5.  Exercise code that uses the mock objects; if necessary, check the result
105*481dde66SAndroid Build Coastguard Worker    using googletest assertions.
106*481dde66SAndroid Build Coastguard Worker6.  When a mock object is destructed, gMock automatically verifies that all
107*481dde66SAndroid Build Coastguard Worker    expectations on it have been satisfied.
108*481dde66SAndroid Build Coastguard Worker
109*481dde66SAndroid Build Coastguard WorkerHere's an example:
110*481dde66SAndroid Build Coastguard Worker
111*481dde66SAndroid Build Coastguard Worker```cpp
112*481dde66SAndroid Build Coastguard Workerusing ::testing::Return;                          // #1
113*481dde66SAndroid Build Coastguard Worker
114*481dde66SAndroid Build Coastguard WorkerTEST(BarTest, DoesThis) {
115*481dde66SAndroid Build Coastguard Worker  MockFoo foo;                                    // #2
116*481dde66SAndroid Build Coastguard Worker
117*481dde66SAndroid Build Coastguard Worker  ON_CALL(foo, GetSize())                         // #3
118*481dde66SAndroid Build Coastguard Worker      .WillByDefault(Return(1));
119*481dde66SAndroid Build Coastguard Worker  // ... other default actions ...
120*481dde66SAndroid Build Coastguard Worker
121*481dde66SAndroid Build Coastguard Worker  EXPECT_CALL(foo, Describe(5))                   // #4
122*481dde66SAndroid Build Coastguard Worker      .Times(3)
123*481dde66SAndroid Build Coastguard Worker      .WillRepeatedly(Return("Category 5"));
124*481dde66SAndroid Build Coastguard Worker  // ... other expectations ...
125*481dde66SAndroid Build Coastguard Worker
126*481dde66SAndroid Build Coastguard Worker  EXPECT_EQ(MyProductionFunction(&foo), "good");  // #5
127*481dde66SAndroid Build Coastguard Worker}                                                 // #6
128*481dde66SAndroid Build Coastguard Worker```
129*481dde66SAndroid Build Coastguard Worker
130*481dde66SAndroid Build Coastguard Worker## Setting Default Actions {#OnCall}
131*481dde66SAndroid Build Coastguard Worker
132*481dde66SAndroid Build Coastguard WorkergMock has a **built-in default action** for any function that returns `void`,
133*481dde66SAndroid Build Coastguard Worker`bool`, a numeric value, or a pointer. In C++11, it will additionally returns
134*481dde66SAndroid Build Coastguard Workerthe default-constructed value, if one exists for the given type.
135*481dde66SAndroid Build Coastguard Worker
136*481dde66SAndroid Build Coastguard WorkerTo customize the default action for functions with return type `T`, use
137*481dde66SAndroid Build Coastguard Worker[`DefaultValue<T>`](reference/mocking.md#DefaultValue). For example:
138*481dde66SAndroid Build Coastguard Worker
139*481dde66SAndroid Build Coastguard Worker```cpp
140*481dde66SAndroid Build Coastguard Worker  // Sets the default action for return type std::unique_ptr<Buzz> to
141*481dde66SAndroid Build Coastguard Worker  // creating a new Buzz every time.
142*481dde66SAndroid Build Coastguard Worker  DefaultValue<std::unique_ptr<Buzz>>::SetFactory(
143*481dde66SAndroid Build Coastguard Worker      [] { return std::make_unique<Buzz>(AccessLevel::kInternal); });
144*481dde66SAndroid Build Coastguard Worker
145*481dde66SAndroid Build Coastguard Worker  // When this fires, the default action of MakeBuzz() will run, which
146*481dde66SAndroid Build Coastguard Worker  // will return a new Buzz object.
147*481dde66SAndroid Build Coastguard Worker  EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")).Times(AnyNumber());
148*481dde66SAndroid Build Coastguard Worker
149*481dde66SAndroid Build Coastguard Worker  auto buzz1 = mock_buzzer_.MakeBuzz("hello");
150*481dde66SAndroid Build Coastguard Worker  auto buzz2 = mock_buzzer_.MakeBuzz("hello");
151*481dde66SAndroid Build Coastguard Worker  EXPECT_NE(buzz1, nullptr);
152*481dde66SAndroid Build Coastguard Worker  EXPECT_NE(buzz2, nullptr);
153*481dde66SAndroid Build Coastguard Worker  EXPECT_NE(buzz1, buzz2);
154*481dde66SAndroid Build Coastguard Worker
155*481dde66SAndroid Build Coastguard Worker  // Resets the default action for return type std::unique_ptr<Buzz>,
156*481dde66SAndroid Build Coastguard Worker  // to avoid interfere with other tests.
157*481dde66SAndroid Build Coastguard Worker  DefaultValue<std::unique_ptr<Buzz>>::Clear();
158*481dde66SAndroid Build Coastguard Worker```
159*481dde66SAndroid Build Coastguard Worker
160*481dde66SAndroid Build Coastguard WorkerTo customize the default action for a particular method of a specific mock
161*481dde66SAndroid Build Coastguard Workerobject, use [`ON_CALL`](reference/mocking.md#ON_CALL). `ON_CALL` has a similar
162*481dde66SAndroid Build Coastguard Workersyntax to `EXPECT_CALL`, but it is used for setting default behaviors when you
163*481dde66SAndroid Build Coastguard Workerdo not require that the mock method is called. See
164*481dde66SAndroid Build Coastguard Worker[Knowing When to Expect](gmock_cook_book.md#UseOnCall) for a more detailed
165*481dde66SAndroid Build Coastguard Workerdiscussion.
166*481dde66SAndroid Build Coastguard Worker
167*481dde66SAndroid Build Coastguard Worker## Setting Expectations {#ExpectCall}
168*481dde66SAndroid Build Coastguard Worker
169*481dde66SAndroid Build Coastguard WorkerSee [`EXPECT_CALL`](reference/mocking.md#EXPECT_CALL) in the Mocking Reference.
170*481dde66SAndroid Build Coastguard Worker
171*481dde66SAndroid Build Coastguard Worker## Matchers {#MatcherList}
172*481dde66SAndroid Build Coastguard Worker
173*481dde66SAndroid Build Coastguard WorkerSee the [Matchers Reference](reference/matchers.md).
174*481dde66SAndroid Build Coastguard Worker
175*481dde66SAndroid Build Coastguard Worker## Actions {#ActionList}
176*481dde66SAndroid Build Coastguard Worker
177*481dde66SAndroid Build Coastguard WorkerSee the [Actions Reference](reference/actions.md).
178*481dde66SAndroid Build Coastguard Worker
179*481dde66SAndroid Build Coastguard Worker## Cardinalities {#CardinalityList}
180*481dde66SAndroid Build Coastguard Worker
181*481dde66SAndroid Build Coastguard WorkerSee the [`Times` clause](reference/mocking.md#EXPECT_CALL.Times) of
182*481dde66SAndroid Build Coastguard Worker`EXPECT_CALL` in the Mocking Reference.
183*481dde66SAndroid Build Coastguard Worker
184*481dde66SAndroid Build Coastguard Worker## Expectation Order
185*481dde66SAndroid Build Coastguard Worker
186*481dde66SAndroid Build Coastguard WorkerBy default, expectations can be matched in *any* order. If some or all
187*481dde66SAndroid Build Coastguard Workerexpectations must be matched in a given order, you can use the
188*481dde66SAndroid Build Coastguard Worker[`After` clause](reference/mocking.md#EXPECT_CALL.After) or
189*481dde66SAndroid Build Coastguard Worker[`InSequence` clause](reference/mocking.md#EXPECT_CALL.InSequence) of
190*481dde66SAndroid Build Coastguard Worker`EXPECT_CALL`, or use an [`InSequence` object](reference/mocking.md#InSequence).
191*481dde66SAndroid Build Coastguard Worker
192*481dde66SAndroid Build Coastguard Worker## Verifying and Resetting a Mock
193*481dde66SAndroid Build Coastguard Worker
194*481dde66SAndroid Build Coastguard WorkergMock will verify the expectations on a mock object when it is destructed, or
195*481dde66SAndroid Build Coastguard Workeryou can do it earlier:
196*481dde66SAndroid Build Coastguard Worker
197*481dde66SAndroid Build Coastguard Worker```cpp
198*481dde66SAndroid Build Coastguard Workerusing ::testing::Mock;
199*481dde66SAndroid Build Coastguard Worker...
200*481dde66SAndroid Build Coastguard Worker// Verifies and removes the expectations on mock_obj;
201*481dde66SAndroid Build Coastguard Worker// returns true if and only if successful.
202*481dde66SAndroid Build Coastguard WorkerMock::VerifyAndClearExpectations(&mock_obj);
203*481dde66SAndroid Build Coastguard Worker...
204*481dde66SAndroid Build Coastguard Worker// Verifies and removes the expectations on mock_obj;
205*481dde66SAndroid Build Coastguard Worker// also removes the default actions set by ON_CALL();
206*481dde66SAndroid Build Coastguard Worker// returns true if and only if successful.
207*481dde66SAndroid Build Coastguard WorkerMock::VerifyAndClear(&mock_obj);
208*481dde66SAndroid Build Coastguard Worker```
209*481dde66SAndroid Build Coastguard Worker
210*481dde66SAndroid Build Coastguard WorkerDo not set new expectations after verifying and clearing a mock after its use.
211*481dde66SAndroid Build Coastguard WorkerSetting expectations after code that exercises the mock has undefined behavior.
212*481dde66SAndroid Build Coastguard WorkerSee [Using Mocks in Tests](gmock_for_dummies.md#using-mocks-in-tests) for more
213*481dde66SAndroid Build Coastguard Workerinformation.
214*481dde66SAndroid Build Coastguard Worker
215*481dde66SAndroid Build Coastguard WorkerYou can also tell gMock that a mock object can be leaked and doesn't need to be
216*481dde66SAndroid Build Coastguard Workerverified:
217*481dde66SAndroid Build Coastguard Worker
218*481dde66SAndroid Build Coastguard Worker```cpp
219*481dde66SAndroid Build Coastguard WorkerMock::AllowLeak(&mock_obj);
220*481dde66SAndroid Build Coastguard Worker```
221*481dde66SAndroid Build Coastguard Worker
222*481dde66SAndroid Build Coastguard Worker## Mock Classes
223*481dde66SAndroid Build Coastguard Worker
224*481dde66SAndroid Build Coastguard WorkergMock defines a convenient mock class template
225*481dde66SAndroid Build Coastguard Worker
226*481dde66SAndroid Build Coastguard Worker```cpp
227*481dde66SAndroid Build Coastguard Workerclass MockFunction<R(A1, ..., An)> {
228*481dde66SAndroid Build Coastguard Worker public:
229*481dde66SAndroid Build Coastguard Worker  MOCK_METHOD(R, Call, (A1, ..., An));
230*481dde66SAndroid Build Coastguard Worker};
231*481dde66SAndroid Build Coastguard Worker```
232*481dde66SAndroid Build Coastguard Worker
233*481dde66SAndroid Build Coastguard WorkerSee this [recipe](gmock_cook_book.md#UsingCheckPoints) for one application of
234*481dde66SAndroid Build Coastguard Workerit.
235*481dde66SAndroid Build Coastguard Worker
236*481dde66SAndroid Build Coastguard Worker## Flags
237*481dde66SAndroid Build Coastguard Worker
238*481dde66SAndroid Build Coastguard Worker| Flag                           | Description                               |
239*481dde66SAndroid Build Coastguard Worker| :----------------------------- | :---------------------------------------- |
240*481dde66SAndroid Build Coastguard Worker| `--gmock_catch_leaked_mocks=0` | Don't report leaked mock objects as failures. |
241*481dde66SAndroid Build Coastguard Worker| `--gmock_verbose=LEVEL` | Sets the default verbosity level (`info`, `warning`, or `error`) of Google Mock messages. |
242