1*481dde66SAndroid Build Coastguard Worker# gMock Cookbook 2*481dde66SAndroid Build Coastguard Worker 3*481dde66SAndroid Build Coastguard WorkerYou can find recipes for using gMock here. If you haven't yet, please read 4*481dde66SAndroid Build Coastguard Worker[the dummy guide](gmock_for_dummies.md) first to make sure you understand the 5*481dde66SAndroid Build Coastguard Workerbasics. 6*481dde66SAndroid Build Coastguard Worker 7*481dde66SAndroid Build Coastguard Worker{: .callout .note} 8*481dde66SAndroid Build Coastguard Worker**Note:** gMock lives in the `testing` name space. For readability, it is 9*481dde66SAndroid Build Coastguard Workerrecommended to write `using ::testing::Foo;` once in your file before using the 10*481dde66SAndroid Build Coastguard Workername `Foo` defined by gMock. We omit such `using` statements in this section for 11*481dde66SAndroid Build Coastguard Workerbrevity, but you should do it in your own code. 12*481dde66SAndroid Build Coastguard Worker 13*481dde66SAndroid Build Coastguard Worker## Creating Mock Classes 14*481dde66SAndroid Build Coastguard Worker 15*481dde66SAndroid Build Coastguard WorkerMock classes are defined as normal classes, using the `MOCK_METHOD` macro to 16*481dde66SAndroid Build Coastguard Workergenerate mocked methods. The macro gets 3 or 4 parameters: 17*481dde66SAndroid Build Coastguard Worker 18*481dde66SAndroid Build Coastguard Worker```cpp 19*481dde66SAndroid Build Coastguard Workerclass MyMock { 20*481dde66SAndroid Build Coastguard Worker public: 21*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(ReturnType, MethodName, (Args...)); 22*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...)); 23*481dde66SAndroid Build Coastguard Worker}; 24*481dde66SAndroid Build Coastguard Worker``` 25*481dde66SAndroid Build Coastguard Worker 26*481dde66SAndroid Build Coastguard WorkerThe first 3 parameters are simply the method declaration, split into 3 parts. 27*481dde66SAndroid Build Coastguard WorkerThe 4th parameter accepts a closed list of qualifiers, which affect the 28*481dde66SAndroid Build Coastguard Workergenerated method: 29*481dde66SAndroid Build Coastguard Worker 30*481dde66SAndroid Build Coastguard Worker* **`const`** - Makes the mocked method a `const` method. Required if 31*481dde66SAndroid Build Coastguard Worker overriding a `const` method. 32*481dde66SAndroid Build Coastguard Worker* **`override`** - Marks the method with `override`. Recommended if overriding 33*481dde66SAndroid Build Coastguard Worker a `virtual` method. 34*481dde66SAndroid Build Coastguard Worker* **`noexcept`** - Marks the method with `noexcept`. Required if overriding a 35*481dde66SAndroid Build Coastguard Worker `noexcept` method. 36*481dde66SAndroid Build Coastguard Worker* **`Calltype(...)`** - Sets the call type for the method (e.g. to 37*481dde66SAndroid Build Coastguard Worker `STDMETHODCALLTYPE`), useful in Windows. 38*481dde66SAndroid Build Coastguard Worker* **`ref(...)`** - Marks the method with the reference qualification 39*481dde66SAndroid Build Coastguard Worker specified. Required if overriding a method that has reference 40*481dde66SAndroid Build Coastguard Worker qualifications. Eg `ref(&)` or `ref(&&)`. 41*481dde66SAndroid Build Coastguard Worker 42*481dde66SAndroid Build Coastguard Worker### Dealing with unprotected commas 43*481dde66SAndroid Build Coastguard Worker 44*481dde66SAndroid Build Coastguard WorkerUnprotected commas, i.e. commas which are not surrounded by parentheses, prevent 45*481dde66SAndroid Build Coastguard Worker`MOCK_METHOD` from parsing its arguments correctly: 46*481dde66SAndroid Build Coastguard Worker 47*481dde66SAndroid Build Coastguard Worker{: .bad} 48*481dde66SAndroid Build Coastguard Worker```cpp 49*481dde66SAndroid Build Coastguard Workerclass MockFoo { 50*481dde66SAndroid Build Coastguard Worker public: 51*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(std::pair<bool, int>, GetPair, ()); // Won't compile! 52*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, CheckMap, (std::map<int, double>, bool)); // Won't compile! 53*481dde66SAndroid Build Coastguard Worker}; 54*481dde66SAndroid Build Coastguard Worker``` 55*481dde66SAndroid Build Coastguard Worker 56*481dde66SAndroid Build Coastguard WorkerSolution 1 - wrap with parentheses: 57*481dde66SAndroid Build Coastguard Worker 58*481dde66SAndroid Build Coastguard Worker{: .good} 59*481dde66SAndroid Build Coastguard Worker```cpp 60*481dde66SAndroid Build Coastguard Workerclass MockFoo { 61*481dde66SAndroid Build Coastguard Worker public: 62*481dde66SAndroid Build Coastguard Worker MOCK_METHOD((std::pair<bool, int>), GetPair, ()); 63*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, CheckMap, ((std::map<int, double>), bool)); 64*481dde66SAndroid Build Coastguard Worker}; 65*481dde66SAndroid Build Coastguard Worker``` 66*481dde66SAndroid Build Coastguard Worker 67*481dde66SAndroid Build Coastguard WorkerNote that wrapping a return or argument type with parentheses is, in general, 68*481dde66SAndroid Build Coastguard Workerinvalid C++. `MOCK_METHOD` removes the parentheses. 69*481dde66SAndroid Build Coastguard Worker 70*481dde66SAndroid Build Coastguard WorkerSolution 2 - define an alias: 71*481dde66SAndroid Build Coastguard Worker 72*481dde66SAndroid Build Coastguard Worker{: .good} 73*481dde66SAndroid Build Coastguard Worker```cpp 74*481dde66SAndroid Build Coastguard Workerclass MockFoo { 75*481dde66SAndroid Build Coastguard Worker public: 76*481dde66SAndroid Build Coastguard Worker using BoolAndInt = std::pair<bool, int>; 77*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(BoolAndInt, GetPair, ()); 78*481dde66SAndroid Build Coastguard Worker using MapIntDouble = std::map<int, double>; 79*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, CheckMap, (MapIntDouble, bool)); 80*481dde66SAndroid Build Coastguard Worker}; 81*481dde66SAndroid Build Coastguard Worker``` 82*481dde66SAndroid Build Coastguard Worker 83*481dde66SAndroid Build Coastguard Worker### Mocking Private or Protected Methods 84*481dde66SAndroid Build Coastguard Worker 85*481dde66SAndroid Build Coastguard WorkerYou must always put a mock method definition (`MOCK_METHOD`) in a `public:` 86*481dde66SAndroid Build Coastguard Workersection of the mock class, regardless of the method being mocked being `public`, 87*481dde66SAndroid Build Coastguard Worker`protected`, or `private` in the base class. This allows `ON_CALL` and 88*481dde66SAndroid Build Coastguard Worker`EXPECT_CALL` to reference the mock function from outside of the mock class. 89*481dde66SAndroid Build Coastguard Worker(Yes, C++ allows a subclass to change the access level of a virtual function in 90*481dde66SAndroid Build Coastguard Workerthe base class.) Example: 91*481dde66SAndroid Build Coastguard Worker 92*481dde66SAndroid Build Coastguard Worker```cpp 93*481dde66SAndroid Build Coastguard Workerclass Foo { 94*481dde66SAndroid Build Coastguard Worker public: 95*481dde66SAndroid Build Coastguard Worker ... 96*481dde66SAndroid Build Coastguard Worker virtual bool Transform(Gadget* g) = 0; 97*481dde66SAndroid Build Coastguard Worker 98*481dde66SAndroid Build Coastguard Worker protected: 99*481dde66SAndroid Build Coastguard Worker virtual void Resume(); 100*481dde66SAndroid Build Coastguard Worker 101*481dde66SAndroid Build Coastguard Worker private: 102*481dde66SAndroid Build Coastguard Worker virtual int GetTimeOut(); 103*481dde66SAndroid Build Coastguard Worker}; 104*481dde66SAndroid Build Coastguard Worker 105*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 106*481dde66SAndroid Build Coastguard Worker public: 107*481dde66SAndroid Build Coastguard Worker ... 108*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, Transform, (Gadget* g), (override)); 109*481dde66SAndroid Build Coastguard Worker 110*481dde66SAndroid Build Coastguard Worker // The following must be in the public section, even though the 111*481dde66SAndroid Build Coastguard Worker // methods are protected or private in the base class. 112*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Resume, (), (override)); 113*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(int, GetTimeOut, (), (override)); 114*481dde66SAndroid Build Coastguard Worker}; 115*481dde66SAndroid Build Coastguard Worker``` 116*481dde66SAndroid Build Coastguard Worker 117*481dde66SAndroid Build Coastguard Worker### Mocking Overloaded Methods 118*481dde66SAndroid Build Coastguard Worker 119*481dde66SAndroid Build Coastguard WorkerYou can mock overloaded functions as usual. No special attention is required: 120*481dde66SAndroid Build Coastguard Worker 121*481dde66SAndroid Build Coastguard Worker```cpp 122*481dde66SAndroid Build Coastguard Workerclass Foo { 123*481dde66SAndroid Build Coastguard Worker ... 124*481dde66SAndroid Build Coastguard Worker 125*481dde66SAndroid Build Coastguard Worker // Must be virtual as we'll inherit from Foo. 126*481dde66SAndroid Build Coastguard Worker virtual ~Foo(); 127*481dde66SAndroid Build Coastguard Worker 128*481dde66SAndroid Build Coastguard Worker // Overloaded on the types and/or numbers of arguments. 129*481dde66SAndroid Build Coastguard Worker virtual int Add(Element x); 130*481dde66SAndroid Build Coastguard Worker virtual int Add(int times, Element x); 131*481dde66SAndroid Build Coastguard Worker 132*481dde66SAndroid Build Coastguard Worker // Overloaded on the const-ness of this object. 133*481dde66SAndroid Build Coastguard Worker virtual Bar& GetBar(); 134*481dde66SAndroid Build Coastguard Worker virtual const Bar& GetBar() const; 135*481dde66SAndroid Build Coastguard Worker}; 136*481dde66SAndroid Build Coastguard Worker 137*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 138*481dde66SAndroid Build Coastguard Worker ... 139*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(int, Add, (Element x), (override)); 140*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(int, Add, (int times, Element x), (override)); 141*481dde66SAndroid Build Coastguard Worker 142*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(Bar&, GetBar, (), (override)); 143*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(const Bar&, GetBar, (), (const, override)); 144*481dde66SAndroid Build Coastguard Worker}; 145*481dde66SAndroid Build Coastguard Worker``` 146*481dde66SAndroid Build Coastguard Worker 147*481dde66SAndroid Build Coastguard Worker{: .callout .note} 148*481dde66SAndroid Build Coastguard Worker**Note:** if you don't mock all versions of the overloaded method, the compiler 149*481dde66SAndroid Build Coastguard Workerwill give you a warning about some methods in the base class being hidden. To 150*481dde66SAndroid Build Coastguard Workerfix that, use `using` to bring them in scope: 151*481dde66SAndroid Build Coastguard Worker 152*481dde66SAndroid Build Coastguard Worker```cpp 153*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 154*481dde66SAndroid Build Coastguard Worker ... 155*481dde66SAndroid Build Coastguard Worker using Foo::Add; 156*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(int, Add, (Element x), (override)); 157*481dde66SAndroid Build Coastguard Worker // We don't want to mock int Add(int times, Element x); 158*481dde66SAndroid Build Coastguard Worker ... 159*481dde66SAndroid Build Coastguard Worker}; 160*481dde66SAndroid Build Coastguard Worker``` 161*481dde66SAndroid Build Coastguard Worker 162*481dde66SAndroid Build Coastguard Worker### Mocking Class Templates 163*481dde66SAndroid Build Coastguard Worker 164*481dde66SAndroid Build Coastguard WorkerYou can mock class templates just like any class. 165*481dde66SAndroid Build Coastguard Worker 166*481dde66SAndroid Build Coastguard Worker```cpp 167*481dde66SAndroid Build Coastguard Workertemplate <typename Elem> 168*481dde66SAndroid Build Coastguard Workerclass StackInterface { 169*481dde66SAndroid Build Coastguard Worker ... 170*481dde66SAndroid Build Coastguard Worker // Must be virtual as we'll inherit from StackInterface. 171*481dde66SAndroid Build Coastguard Worker virtual ~StackInterface(); 172*481dde66SAndroid Build Coastguard Worker 173*481dde66SAndroid Build Coastguard Worker virtual int GetSize() const = 0; 174*481dde66SAndroid Build Coastguard Worker virtual void Push(const Elem& x) = 0; 175*481dde66SAndroid Build Coastguard Worker}; 176*481dde66SAndroid Build Coastguard Worker 177*481dde66SAndroid Build Coastguard Workertemplate <typename Elem> 178*481dde66SAndroid Build Coastguard Workerclass MockStack : public StackInterface<Elem> { 179*481dde66SAndroid Build Coastguard Worker ... 180*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(int, GetSize, (), (override)); 181*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Push, (const Elem& x), (override)); 182*481dde66SAndroid Build Coastguard Worker}; 183*481dde66SAndroid Build Coastguard Worker``` 184*481dde66SAndroid Build Coastguard Worker 185*481dde66SAndroid Build Coastguard Worker### Mocking Non-virtual Methods {#MockingNonVirtualMethods} 186*481dde66SAndroid Build Coastguard Worker 187*481dde66SAndroid Build Coastguard WorkergMock can mock non-virtual functions to be used in Hi-perf dependency injection. 188*481dde66SAndroid Build Coastguard Worker 189*481dde66SAndroid Build Coastguard WorkerIn this case, instead of sharing a common base class with the real class, your 190*481dde66SAndroid Build Coastguard Workermock class will be *unrelated* to the real class, but contain methods with the 191*481dde66SAndroid Build Coastguard Workersame signatures. The syntax for mocking non-virtual methods is the *same* as 192*481dde66SAndroid Build Coastguard Workermocking virtual methods (just don't add `override`): 193*481dde66SAndroid Build Coastguard Worker 194*481dde66SAndroid Build Coastguard Worker```cpp 195*481dde66SAndroid Build Coastguard Worker// A simple packet stream class. None of its members is virtual. 196*481dde66SAndroid Build Coastguard Workerclass ConcretePacketStream { 197*481dde66SAndroid Build Coastguard Worker public: 198*481dde66SAndroid Build Coastguard Worker void AppendPacket(Packet* new_packet); 199*481dde66SAndroid Build Coastguard Worker const Packet* GetPacket(size_t packet_number) const; 200*481dde66SAndroid Build Coastguard Worker size_t NumberOfPackets() const; 201*481dde66SAndroid Build Coastguard Worker ... 202*481dde66SAndroid Build Coastguard Worker}; 203*481dde66SAndroid Build Coastguard Worker 204*481dde66SAndroid Build Coastguard Worker// A mock packet stream class. It inherits from no other, but defines 205*481dde66SAndroid Build Coastguard Worker// GetPacket() and NumberOfPackets(). 206*481dde66SAndroid Build Coastguard Workerclass MockPacketStream { 207*481dde66SAndroid Build Coastguard Worker public: 208*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(const Packet*, GetPacket, (size_t packet_number), (const)); 209*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(size_t, NumberOfPackets, (), (const)); 210*481dde66SAndroid Build Coastguard Worker ... 211*481dde66SAndroid Build Coastguard Worker}; 212*481dde66SAndroid Build Coastguard Worker``` 213*481dde66SAndroid Build Coastguard Worker 214*481dde66SAndroid Build Coastguard WorkerNote that the mock class doesn't define `AppendPacket()`, unlike the real class. 215*481dde66SAndroid Build Coastguard WorkerThat's fine as long as the test doesn't need to call it. 216*481dde66SAndroid Build Coastguard Worker 217*481dde66SAndroid Build Coastguard WorkerNext, you need a way to say that you want to use `ConcretePacketStream` in 218*481dde66SAndroid Build Coastguard Workerproduction code, and use `MockPacketStream` in tests. Since the functions are 219*481dde66SAndroid Build Coastguard Workernot virtual and the two classes are unrelated, you must specify your choice at 220*481dde66SAndroid Build Coastguard Worker*compile time* (as opposed to run time). 221*481dde66SAndroid Build Coastguard Worker 222*481dde66SAndroid Build Coastguard WorkerOne way to do it is to templatize your code that needs to use a packet stream. 223*481dde66SAndroid Build Coastguard WorkerMore specifically, you will give your code a template type argument for the type 224*481dde66SAndroid Build Coastguard Workerof the packet stream. In production, you will instantiate your template with 225*481dde66SAndroid Build Coastguard Worker`ConcretePacketStream` as the type argument. In tests, you will instantiate the 226*481dde66SAndroid Build Coastguard Workersame template with `MockPacketStream`. For example, you may write: 227*481dde66SAndroid Build Coastguard Worker 228*481dde66SAndroid Build Coastguard Worker```cpp 229*481dde66SAndroid Build Coastguard Workertemplate <class PacketStream> 230*481dde66SAndroid Build Coastguard Workervoid CreateConnection(PacketStream* stream) { ... } 231*481dde66SAndroid Build Coastguard Worker 232*481dde66SAndroid Build Coastguard Workertemplate <class PacketStream> 233*481dde66SAndroid Build Coastguard Workerclass PacketReader { 234*481dde66SAndroid Build Coastguard Worker public: 235*481dde66SAndroid Build Coastguard Worker void ReadPackets(PacketStream* stream, size_t packet_num); 236*481dde66SAndroid Build Coastguard Worker}; 237*481dde66SAndroid Build Coastguard Worker``` 238*481dde66SAndroid Build Coastguard Worker 239*481dde66SAndroid Build Coastguard WorkerThen you can use `CreateConnection<ConcretePacketStream>()` and 240*481dde66SAndroid Build Coastguard Worker`PacketReader<ConcretePacketStream>` in production code, and use 241*481dde66SAndroid Build Coastguard Worker`CreateConnection<MockPacketStream>()` and `PacketReader<MockPacketStream>` in 242*481dde66SAndroid Build Coastguard Workertests. 243*481dde66SAndroid Build Coastguard Worker 244*481dde66SAndroid Build Coastguard Worker```cpp 245*481dde66SAndroid Build Coastguard Worker MockPacketStream mock_stream; 246*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_stream, ...)...; 247*481dde66SAndroid Build Coastguard Worker .. set more expectations on mock_stream ... 248*481dde66SAndroid Build Coastguard Worker PacketReader<MockPacketStream> reader(&mock_stream); 249*481dde66SAndroid Build Coastguard Worker ... exercise reader ... 250*481dde66SAndroid Build Coastguard Worker``` 251*481dde66SAndroid Build Coastguard Worker 252*481dde66SAndroid Build Coastguard Worker### Mocking Free Functions 253*481dde66SAndroid Build Coastguard Worker 254*481dde66SAndroid Build Coastguard WorkerIt is not possible to directly mock a free function (i.e. a C-style function or 255*481dde66SAndroid Build Coastguard Workera static method). If you need to, you can rewrite your code to use an interface 256*481dde66SAndroid Build Coastguard Worker(abstract class). 257*481dde66SAndroid Build Coastguard Worker 258*481dde66SAndroid Build Coastguard WorkerInstead of calling a free function (say, `OpenFile`) directly, introduce an 259*481dde66SAndroid Build Coastguard Workerinterface for it and have a concrete subclass that calls the free function: 260*481dde66SAndroid Build Coastguard Worker 261*481dde66SAndroid Build Coastguard Worker```cpp 262*481dde66SAndroid Build Coastguard Workerclass FileInterface { 263*481dde66SAndroid Build Coastguard Worker public: 264*481dde66SAndroid Build Coastguard Worker ... 265*481dde66SAndroid Build Coastguard Worker virtual bool Open(const char* path, const char* mode) = 0; 266*481dde66SAndroid Build Coastguard Worker}; 267*481dde66SAndroid Build Coastguard Worker 268*481dde66SAndroid Build Coastguard Workerclass File : public FileInterface { 269*481dde66SAndroid Build Coastguard Worker public: 270*481dde66SAndroid Build Coastguard Worker ... 271*481dde66SAndroid Build Coastguard Worker bool Open(const char* path, const char* mode) override { 272*481dde66SAndroid Build Coastguard Worker return OpenFile(path, mode); 273*481dde66SAndroid Build Coastguard Worker } 274*481dde66SAndroid Build Coastguard Worker}; 275*481dde66SAndroid Build Coastguard Worker``` 276*481dde66SAndroid Build Coastguard Worker 277*481dde66SAndroid Build Coastguard WorkerYour code should talk to `FileInterface` to open a file. Now it's easy to mock 278*481dde66SAndroid Build Coastguard Workerout the function. 279*481dde66SAndroid Build Coastguard Worker 280*481dde66SAndroid Build Coastguard WorkerThis may seem like a lot of hassle, but in practice you often have multiple 281*481dde66SAndroid Build Coastguard Workerrelated functions that you can put in the same interface, so the per-function 282*481dde66SAndroid Build Coastguard Workersyntactic overhead will be much lower. 283*481dde66SAndroid Build Coastguard Worker 284*481dde66SAndroid Build Coastguard WorkerIf you are concerned about the performance overhead incurred by virtual 285*481dde66SAndroid Build Coastguard Workerfunctions, and profiling confirms your concern, you can combine this with the 286*481dde66SAndroid Build Coastguard Workerrecipe for [mocking non-virtual methods](#MockingNonVirtualMethods). 287*481dde66SAndroid Build Coastguard Worker 288*481dde66SAndroid Build Coastguard WorkerAlternatively, instead of introducing a new interface, you can rewrite your code 289*481dde66SAndroid Build Coastguard Workerto accept a std::function instead of the free function, and then use 290*481dde66SAndroid Build Coastguard Worker[MockFunction](#MockFunction) to mock the std::function. 291*481dde66SAndroid Build Coastguard Worker 292*481dde66SAndroid Build Coastguard Worker### Old-Style `MOCK_METHODn` Macros 293*481dde66SAndroid Build Coastguard Worker 294*481dde66SAndroid Build Coastguard WorkerBefore the generic `MOCK_METHOD` macro 295*481dde66SAndroid Build Coastguard Worker[was introduced in 2018](https://github.com/google/googletest/commit/c5f08bf91944ce1b19bcf414fa1760e69d20afc2), 296*481dde66SAndroid Build Coastguard Workermocks where created using a family of macros collectively called `MOCK_METHODn`. 297*481dde66SAndroid Build Coastguard WorkerThese macros are still supported, though migration to the new `MOCK_METHOD` is 298*481dde66SAndroid Build Coastguard Workerrecommended. 299*481dde66SAndroid Build Coastguard Worker 300*481dde66SAndroid Build Coastguard WorkerThe macros in the `MOCK_METHODn` family differ from `MOCK_METHOD`: 301*481dde66SAndroid Build Coastguard Worker 302*481dde66SAndroid Build Coastguard Worker* The general structure is `MOCK_METHODn(MethodName, ReturnType(Args))`, 303*481dde66SAndroid Build Coastguard Worker instead of `MOCK_METHOD(ReturnType, MethodName, (Args))`. 304*481dde66SAndroid Build Coastguard Worker* The number `n` must equal the number of arguments. 305*481dde66SAndroid Build Coastguard Worker* When mocking a const method, one must use `MOCK_CONST_METHODn`. 306*481dde66SAndroid Build Coastguard Worker* When mocking a class template, the macro name must be suffixed with `_T`. 307*481dde66SAndroid Build Coastguard Worker* In order to specify the call type, the macro name must be suffixed with 308*481dde66SAndroid Build Coastguard Worker `_WITH_CALLTYPE`, and the call type is the first macro argument. 309*481dde66SAndroid Build Coastguard Worker 310*481dde66SAndroid Build Coastguard WorkerOld macros and their new equivalents: 311*481dde66SAndroid Build Coastguard Worker 312*481dde66SAndroid Build Coastguard Worker<table> 313*481dde66SAndroid Build Coastguard Worker <tr><th colspan=2>Simple</th></tr> 314*481dde66SAndroid Build Coastguard Worker <tr> 315*481dde66SAndroid Build Coastguard Worker <td>Old</td> 316*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD1(Foo, bool(int))</code></td> 317*481dde66SAndroid Build Coastguard Worker </tr> 318*481dde66SAndroid Build Coastguard Worker <tr> 319*481dde66SAndroid Build Coastguard Worker <td>New</td> 320*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD(bool, Foo, (int))</code></td> 321*481dde66SAndroid Build Coastguard Worker </tr> 322*481dde66SAndroid Build Coastguard Worker 323*481dde66SAndroid Build Coastguard Worker <tr><th colspan=2>Const Method</th></tr> 324*481dde66SAndroid Build Coastguard Worker <tr> 325*481dde66SAndroid Build Coastguard Worker <td>Old</td> 326*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_CONST_METHOD1(Foo, bool(int))</code></td> 327*481dde66SAndroid Build Coastguard Worker </tr> 328*481dde66SAndroid Build Coastguard Worker <tr> 329*481dde66SAndroid Build Coastguard Worker <td>New</td> 330*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD(bool, Foo, (int), (const))</code></td> 331*481dde66SAndroid Build Coastguard Worker </tr> 332*481dde66SAndroid Build Coastguard Worker 333*481dde66SAndroid Build Coastguard Worker <tr><th colspan=2>Method in a Class Template</th></tr> 334*481dde66SAndroid Build Coastguard Worker <tr> 335*481dde66SAndroid Build Coastguard Worker <td>Old</td> 336*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD1_T(Foo, bool(int))</code></td> 337*481dde66SAndroid Build Coastguard Worker </tr> 338*481dde66SAndroid Build Coastguard Worker <tr> 339*481dde66SAndroid Build Coastguard Worker <td>New</td> 340*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD(bool, Foo, (int))</code></td> 341*481dde66SAndroid Build Coastguard Worker </tr> 342*481dde66SAndroid Build Coastguard Worker 343*481dde66SAndroid Build Coastguard Worker <tr><th colspan=2>Const Method in a Class Template</th></tr> 344*481dde66SAndroid Build Coastguard Worker <tr> 345*481dde66SAndroid Build Coastguard Worker <td>Old</td> 346*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_CONST_METHOD1_T(Foo, bool(int))</code></td> 347*481dde66SAndroid Build Coastguard Worker </tr> 348*481dde66SAndroid Build Coastguard Worker <tr> 349*481dde66SAndroid Build Coastguard Worker <td>New</td> 350*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD(bool, Foo, (int), (const))</code></td> 351*481dde66SAndroid Build Coastguard Worker </tr> 352*481dde66SAndroid Build Coastguard Worker 353*481dde66SAndroid Build Coastguard Worker <tr><th colspan=2>Method with Call Type</th></tr> 354*481dde66SAndroid Build Coastguard Worker <tr> 355*481dde66SAndroid Build Coastguard Worker <td>Old</td> 356*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))</code></td> 357*481dde66SAndroid Build Coastguard Worker </tr> 358*481dde66SAndroid Build Coastguard Worker <tr> 359*481dde66SAndroid Build Coastguard Worker <td>New</td> 360*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD(bool, Foo, (int), (Calltype(STDMETHODCALLTYPE)))</code></td> 361*481dde66SAndroid Build Coastguard Worker </tr> 362*481dde66SAndroid Build Coastguard Worker 363*481dde66SAndroid Build Coastguard Worker <tr><th colspan=2>Const Method with Call Type</th></tr> 364*481dde66SAndroid Build Coastguard Worker <tr> 365*481dde66SAndroid Build Coastguard Worker <td>Old</td> 366*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_CONST_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))</code></td> 367*481dde66SAndroid Build Coastguard Worker </tr> 368*481dde66SAndroid Build Coastguard Worker <tr> 369*481dde66SAndroid Build Coastguard Worker <td>New</td> 370*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD(bool, Foo, (int), (const, Calltype(STDMETHODCALLTYPE)))</code></td> 371*481dde66SAndroid Build Coastguard Worker </tr> 372*481dde66SAndroid Build Coastguard Worker 373*481dde66SAndroid Build Coastguard Worker <tr><th colspan=2>Method with Call Type in a Class Template</th></tr> 374*481dde66SAndroid Build Coastguard Worker <tr> 375*481dde66SAndroid Build Coastguard Worker <td>Old</td> 376*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))</code></td> 377*481dde66SAndroid Build Coastguard Worker </tr> 378*481dde66SAndroid Build Coastguard Worker <tr> 379*481dde66SAndroid Build Coastguard Worker <td>New</td> 380*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD(bool, Foo, (int), (Calltype(STDMETHODCALLTYPE)))</code></td> 381*481dde66SAndroid Build Coastguard Worker </tr> 382*481dde66SAndroid Build Coastguard Worker 383*481dde66SAndroid Build Coastguard Worker <tr><th colspan=2>Const Method with Call Type in a Class Template</th></tr> 384*481dde66SAndroid Build Coastguard Worker <tr> 385*481dde66SAndroid Build Coastguard Worker <td>Old</td> 386*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_CONST_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int))</code></td> 387*481dde66SAndroid Build Coastguard Worker </tr> 388*481dde66SAndroid Build Coastguard Worker <tr> 389*481dde66SAndroid Build Coastguard Worker <td>New</td> 390*481dde66SAndroid Build Coastguard Worker <td><code>MOCK_METHOD(bool, Foo, (int), (const, Calltype(STDMETHODCALLTYPE)))</code></td> 391*481dde66SAndroid Build Coastguard Worker </tr> 392*481dde66SAndroid Build Coastguard Worker</table> 393*481dde66SAndroid Build Coastguard Worker 394*481dde66SAndroid Build Coastguard Worker### The Nice, the Strict, and the Naggy {#NiceStrictNaggy} 395*481dde66SAndroid Build Coastguard Worker 396*481dde66SAndroid Build Coastguard WorkerIf a mock method has no `EXPECT_CALL` spec but is called, we say that it's an 397*481dde66SAndroid Build Coastguard Worker"uninteresting call", and the default action (which can be specified using 398*481dde66SAndroid Build Coastguard Worker`ON_CALL()`) of the method will be taken. Currently, an uninteresting call will 399*481dde66SAndroid Build Coastguard Workeralso by default cause gMock to print a warning. 400*481dde66SAndroid Build Coastguard Worker 401*481dde66SAndroid Build Coastguard WorkerHowever, sometimes you may want to ignore these uninteresting calls, and 402*481dde66SAndroid Build Coastguard Workersometimes you may want to treat them as errors. gMock lets you make the decision 403*481dde66SAndroid Build Coastguard Workeron a per-mock-object basis. 404*481dde66SAndroid Build Coastguard Worker 405*481dde66SAndroid Build Coastguard WorkerSuppose your test uses a mock class `MockFoo`: 406*481dde66SAndroid Build Coastguard Worker 407*481dde66SAndroid Build Coastguard Worker```cpp 408*481dde66SAndroid Build Coastguard WorkerTEST(...) { 409*481dde66SAndroid Build Coastguard Worker MockFoo mock_foo; 410*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_foo, DoThis()); 411*481dde66SAndroid Build Coastguard Worker ... code that uses mock_foo ... 412*481dde66SAndroid Build Coastguard Worker} 413*481dde66SAndroid Build Coastguard Worker``` 414*481dde66SAndroid Build Coastguard Worker 415*481dde66SAndroid Build Coastguard WorkerIf a method of `mock_foo` other than `DoThis()` is called, you will get a 416*481dde66SAndroid Build Coastguard Workerwarning. However, if you rewrite your test to use `NiceMock<MockFoo>` instead, 417*481dde66SAndroid Build Coastguard Workeryou can suppress the warning: 418*481dde66SAndroid Build Coastguard Worker 419*481dde66SAndroid Build Coastguard Worker```cpp 420*481dde66SAndroid Build Coastguard Workerusing ::testing::NiceMock; 421*481dde66SAndroid Build Coastguard Worker 422*481dde66SAndroid Build Coastguard WorkerTEST(...) { 423*481dde66SAndroid Build Coastguard Worker NiceMock<MockFoo> mock_foo; 424*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_foo, DoThis()); 425*481dde66SAndroid Build Coastguard Worker ... code that uses mock_foo ... 426*481dde66SAndroid Build Coastguard Worker} 427*481dde66SAndroid Build Coastguard Worker``` 428*481dde66SAndroid Build Coastguard Worker 429*481dde66SAndroid Build Coastguard Worker`NiceMock<MockFoo>` is a subclass of `MockFoo`, so it can be used wherever 430*481dde66SAndroid Build Coastguard Worker`MockFoo` is accepted. 431*481dde66SAndroid Build Coastguard Worker 432*481dde66SAndroid Build Coastguard WorkerIt also works if `MockFoo`'s constructor takes some arguments, as 433*481dde66SAndroid Build Coastguard Worker`NiceMock<MockFoo>` "inherits" `MockFoo`'s constructors: 434*481dde66SAndroid Build Coastguard Worker 435*481dde66SAndroid Build Coastguard Worker```cpp 436*481dde66SAndroid Build Coastguard Workerusing ::testing::NiceMock; 437*481dde66SAndroid Build Coastguard Worker 438*481dde66SAndroid Build Coastguard WorkerTEST(...) { 439*481dde66SAndroid Build Coastguard Worker NiceMock<MockFoo> mock_foo(5, "hi"); // Calls MockFoo(5, "hi"). 440*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_foo, DoThis()); 441*481dde66SAndroid Build Coastguard Worker ... code that uses mock_foo ... 442*481dde66SAndroid Build Coastguard Worker} 443*481dde66SAndroid Build Coastguard Worker``` 444*481dde66SAndroid Build Coastguard Worker 445*481dde66SAndroid Build Coastguard WorkerThe usage of `StrictMock` is similar, except that it makes all uninteresting 446*481dde66SAndroid Build Coastguard Workercalls failures: 447*481dde66SAndroid Build Coastguard Worker 448*481dde66SAndroid Build Coastguard Worker```cpp 449*481dde66SAndroid Build Coastguard Workerusing ::testing::StrictMock; 450*481dde66SAndroid Build Coastguard Worker 451*481dde66SAndroid Build Coastguard WorkerTEST(...) { 452*481dde66SAndroid Build Coastguard Worker StrictMock<MockFoo> mock_foo; 453*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_foo, DoThis()); 454*481dde66SAndroid Build Coastguard Worker ... code that uses mock_foo ... 455*481dde66SAndroid Build Coastguard Worker 456*481dde66SAndroid Build Coastguard Worker // The test will fail if a method of mock_foo other than DoThis() 457*481dde66SAndroid Build Coastguard Worker // is called. 458*481dde66SAndroid Build Coastguard Worker} 459*481dde66SAndroid Build Coastguard Worker``` 460*481dde66SAndroid Build Coastguard Worker 461*481dde66SAndroid Build Coastguard Worker{: .callout .note} 462*481dde66SAndroid Build Coastguard WorkerNOTE: `NiceMock` and `StrictMock` only affects *uninteresting* calls (calls of 463*481dde66SAndroid Build Coastguard Worker*methods* with no expectations); they do not affect *unexpected* calls (calls of 464*481dde66SAndroid Build Coastguard Workermethods with expectations, but they don't match). See 465*481dde66SAndroid Build Coastguard Worker[Understanding Uninteresting vs Unexpected Calls](#uninteresting-vs-unexpected). 466*481dde66SAndroid Build Coastguard Worker 467*481dde66SAndroid Build Coastguard WorkerThere are some caveats though (sadly they are side effects of C++'s 468*481dde66SAndroid Build Coastguard Workerlimitations): 469*481dde66SAndroid Build Coastguard Worker 470*481dde66SAndroid Build Coastguard Worker1. `NiceMock<MockFoo>` and `StrictMock<MockFoo>` only work for mock methods 471*481dde66SAndroid Build Coastguard Worker defined using the `MOCK_METHOD` macro **directly** in the `MockFoo` class. 472*481dde66SAndroid Build Coastguard Worker If a mock method is defined in a **base class** of `MockFoo`, the "nice" or 473*481dde66SAndroid Build Coastguard Worker "strict" modifier may not affect it, depending on the compiler. In 474*481dde66SAndroid Build Coastguard Worker particular, nesting `NiceMock` and `StrictMock` (e.g. 475*481dde66SAndroid Build Coastguard Worker `NiceMock<StrictMock<MockFoo> >`) is **not** supported. 476*481dde66SAndroid Build Coastguard Worker2. `NiceMock<MockFoo>` and `StrictMock<MockFoo>` may not work correctly if the 477*481dde66SAndroid Build Coastguard Worker destructor of `MockFoo` is not virtual. We would like to fix this, but it 478*481dde66SAndroid Build Coastguard Worker requires cleaning up existing tests. 479*481dde66SAndroid Build Coastguard Worker 480*481dde66SAndroid Build Coastguard WorkerFinally, you should be **very cautious** about when to use naggy or strict 481*481dde66SAndroid Build Coastguard Workermocks, as they tend to make tests more brittle and harder to maintain. When you 482*481dde66SAndroid Build Coastguard Workerrefactor your code without changing its externally visible behavior, ideally you 483*481dde66SAndroid Build Coastguard Workershouldn't need to update any tests. If your code interacts with a naggy mock, 484*481dde66SAndroid Build Coastguard Workerhowever, you may start to get spammed with warnings as the result of your 485*481dde66SAndroid Build Coastguard Workerchange. Worse, if your code interacts with a strict mock, your tests may start 486*481dde66SAndroid Build Coastguard Workerto fail and you'll be forced to fix them. Our general recommendation is to use 487*481dde66SAndroid Build Coastguard Workernice mocks (not yet the default) most of the time, use naggy mocks (the current 488*481dde66SAndroid Build Coastguard Workerdefault) when developing or debugging tests, and use strict mocks only as the 489*481dde66SAndroid Build Coastguard Workerlast resort. 490*481dde66SAndroid Build Coastguard Worker 491*481dde66SAndroid Build Coastguard Worker### Simplifying the Interface without Breaking Existing Code {#SimplerInterfaces} 492*481dde66SAndroid Build Coastguard Worker 493*481dde66SAndroid Build Coastguard WorkerSometimes a method has a long list of arguments that is mostly uninteresting. 494*481dde66SAndroid Build Coastguard WorkerFor example: 495*481dde66SAndroid Build Coastguard Worker 496*481dde66SAndroid Build Coastguard Worker```cpp 497*481dde66SAndroid Build Coastguard Workerclass LogSink { 498*481dde66SAndroid Build Coastguard Worker public: 499*481dde66SAndroid Build Coastguard Worker ... 500*481dde66SAndroid Build Coastguard Worker virtual void send(LogSeverity severity, const char* full_filename, 501*481dde66SAndroid Build Coastguard Worker const char* base_filename, int line, 502*481dde66SAndroid Build Coastguard Worker const struct tm* tm_time, 503*481dde66SAndroid Build Coastguard Worker const char* message, size_t message_len) = 0; 504*481dde66SAndroid Build Coastguard Worker}; 505*481dde66SAndroid Build Coastguard Worker``` 506*481dde66SAndroid Build Coastguard Worker 507*481dde66SAndroid Build Coastguard WorkerThis method's argument list is lengthy and hard to work with (the `message` 508*481dde66SAndroid Build Coastguard Workerargument is not even 0-terminated). If we mock it as is, using the mock will be 509*481dde66SAndroid Build Coastguard Workerawkward. If, however, we try to simplify this interface, we'll need to fix all 510*481dde66SAndroid Build Coastguard Workerclients depending on it, which is often infeasible. 511*481dde66SAndroid Build Coastguard Worker 512*481dde66SAndroid Build Coastguard WorkerThe trick is to redispatch the method in the mock class: 513*481dde66SAndroid Build Coastguard Worker 514*481dde66SAndroid Build Coastguard Worker```cpp 515*481dde66SAndroid Build Coastguard Workerclass ScopedMockLog : public LogSink { 516*481dde66SAndroid Build Coastguard Worker public: 517*481dde66SAndroid Build Coastguard Worker ... 518*481dde66SAndroid Build Coastguard Worker void send(LogSeverity severity, const char* full_filename, 519*481dde66SAndroid Build Coastguard Worker const char* base_filename, int line, const tm* tm_time, 520*481dde66SAndroid Build Coastguard Worker const char* message, size_t message_len) override { 521*481dde66SAndroid Build Coastguard Worker // We are only interested in the log severity, full file name, and 522*481dde66SAndroid Build Coastguard Worker // log message. 523*481dde66SAndroid Build Coastguard Worker Log(severity, full_filename, std::string(message, message_len)); 524*481dde66SAndroid Build Coastguard Worker } 525*481dde66SAndroid Build Coastguard Worker 526*481dde66SAndroid Build Coastguard Worker // Implements the mock method: 527*481dde66SAndroid Build Coastguard Worker // 528*481dde66SAndroid Build Coastguard Worker // void Log(LogSeverity severity, 529*481dde66SAndroid Build Coastguard Worker // const string& file_path, 530*481dde66SAndroid Build Coastguard Worker // const string& message); 531*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Log, 532*481dde66SAndroid Build Coastguard Worker (LogSeverity severity, const string& file_path, 533*481dde66SAndroid Build Coastguard Worker const string& message)); 534*481dde66SAndroid Build Coastguard Worker}; 535*481dde66SAndroid Build Coastguard Worker``` 536*481dde66SAndroid Build Coastguard Worker 537*481dde66SAndroid Build Coastguard WorkerBy defining a new mock method with a trimmed argument list, we make the mock 538*481dde66SAndroid Build Coastguard Workerclass more user-friendly. 539*481dde66SAndroid Build Coastguard Worker 540*481dde66SAndroid Build Coastguard WorkerThis technique may also be applied to make overloaded methods more amenable to 541*481dde66SAndroid Build Coastguard Workermocking. For example, when overloads have been used to implement default 542*481dde66SAndroid Build Coastguard Workerarguments: 543*481dde66SAndroid Build Coastguard Worker 544*481dde66SAndroid Build Coastguard Worker```cpp 545*481dde66SAndroid Build Coastguard Workerclass MockTurtleFactory : public TurtleFactory { 546*481dde66SAndroid Build Coastguard Worker public: 547*481dde66SAndroid Build Coastguard Worker Turtle* MakeTurtle(int length, int weight) override { ... } 548*481dde66SAndroid Build Coastguard Worker Turtle* MakeTurtle(int length, int weight, int speed) override { ... } 549*481dde66SAndroid Build Coastguard Worker 550*481dde66SAndroid Build Coastguard Worker // the above methods delegate to this one: 551*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(Turtle*, DoMakeTurtle, ()); 552*481dde66SAndroid Build Coastguard Worker}; 553*481dde66SAndroid Build Coastguard Worker``` 554*481dde66SAndroid Build Coastguard Worker 555*481dde66SAndroid Build Coastguard WorkerThis allows tests that don't care which overload was invoked to avoid specifying 556*481dde66SAndroid Build Coastguard Workerargument matchers: 557*481dde66SAndroid Build Coastguard Worker 558*481dde66SAndroid Build Coastguard Worker```cpp 559*481dde66SAndroid Build Coastguard WorkerON_CALL(factory, DoMakeTurtle) 560*481dde66SAndroid Build Coastguard Worker .WillByDefault(Return(MakeMockTurtle())); 561*481dde66SAndroid Build Coastguard Worker``` 562*481dde66SAndroid Build Coastguard Worker 563*481dde66SAndroid Build Coastguard Worker### Alternative to Mocking Concrete Classes 564*481dde66SAndroid Build Coastguard Worker 565*481dde66SAndroid Build Coastguard WorkerOften you may find yourself using classes that don't implement interfaces. In 566*481dde66SAndroid Build Coastguard Workerorder to test your code that uses such a class (let's call it `Concrete`), you 567*481dde66SAndroid Build Coastguard Workermay be tempted to make the methods of `Concrete` virtual and then mock it. 568*481dde66SAndroid Build Coastguard Worker 569*481dde66SAndroid Build Coastguard WorkerTry not to do that. 570*481dde66SAndroid Build Coastguard Worker 571*481dde66SAndroid Build Coastguard WorkerMaking a non-virtual function virtual is a big decision. It creates an extension 572*481dde66SAndroid Build Coastguard Workerpoint where subclasses can tweak your class' behavior. This weakens your control 573*481dde66SAndroid Build Coastguard Workeron the class because now it's harder to maintain the class invariants. You 574*481dde66SAndroid Build Coastguard Workershould make a function virtual only when there is a valid reason for a subclass 575*481dde66SAndroid Build Coastguard Workerto override it. 576*481dde66SAndroid Build Coastguard Worker 577*481dde66SAndroid Build Coastguard WorkerMocking concrete classes directly is problematic as it creates a tight coupling 578*481dde66SAndroid Build Coastguard Workerbetween the class and the tests - any small change in the class may invalidate 579*481dde66SAndroid Build Coastguard Workeryour tests and make test maintenance a pain. 580*481dde66SAndroid Build Coastguard Worker 581*481dde66SAndroid Build Coastguard WorkerTo avoid such problems, many programmers have been practicing "coding to 582*481dde66SAndroid Build Coastguard Workerinterfaces": instead of talking to the `Concrete` class, your code would define 583*481dde66SAndroid Build Coastguard Workeran interface and talk to it. Then you implement that interface as an adaptor on 584*481dde66SAndroid Build Coastguard Workertop of `Concrete`. In tests, you can easily mock that interface to observe how 585*481dde66SAndroid Build Coastguard Workeryour code is doing. 586*481dde66SAndroid Build Coastguard Worker 587*481dde66SAndroid Build Coastguard WorkerThis technique incurs some overhead: 588*481dde66SAndroid Build Coastguard Worker 589*481dde66SAndroid Build Coastguard Worker* You pay the cost of virtual function calls (usually not a problem). 590*481dde66SAndroid Build Coastguard Worker* There is more abstraction for the programmers to learn. 591*481dde66SAndroid Build Coastguard Worker 592*481dde66SAndroid Build Coastguard WorkerHowever, it can also bring significant benefits in addition to better 593*481dde66SAndroid Build Coastguard Workertestability: 594*481dde66SAndroid Build Coastguard Worker 595*481dde66SAndroid Build Coastguard Worker* `Concrete`'s API may not fit your problem domain very well, as you may not 596*481dde66SAndroid Build Coastguard Worker be the only client it tries to serve. By designing your own interface, you 597*481dde66SAndroid Build Coastguard Worker have a chance to tailor it to your need - you may add higher-level 598*481dde66SAndroid Build Coastguard Worker functionalities, rename stuff, etc instead of just trimming the class. This 599*481dde66SAndroid Build Coastguard Worker allows you to write your code (user of the interface) in a more natural way, 600*481dde66SAndroid Build Coastguard Worker which means it will be more readable, more maintainable, and you'll be more 601*481dde66SAndroid Build Coastguard Worker productive. 602*481dde66SAndroid Build Coastguard Worker* If `Concrete`'s implementation ever has to change, you don't have to rewrite 603*481dde66SAndroid Build Coastguard Worker everywhere it is used. Instead, you can absorb the change in your 604*481dde66SAndroid Build Coastguard Worker implementation of the interface, and your other code and tests will be 605*481dde66SAndroid Build Coastguard Worker insulated from this change. 606*481dde66SAndroid Build Coastguard Worker 607*481dde66SAndroid Build Coastguard WorkerSome people worry that if everyone is practicing this technique, they will end 608*481dde66SAndroid Build Coastguard Workerup writing lots of redundant code. This concern is totally understandable. 609*481dde66SAndroid Build Coastguard WorkerHowever, there are two reasons why it may not be the case: 610*481dde66SAndroid Build Coastguard Worker 611*481dde66SAndroid Build Coastguard Worker* Different projects may need to use `Concrete` in different ways, so the best 612*481dde66SAndroid Build Coastguard Worker interfaces for them will be different. Therefore, each of them will have its 613*481dde66SAndroid Build Coastguard Worker own domain-specific interface on top of `Concrete`, and they will not be the 614*481dde66SAndroid Build Coastguard Worker same code. 615*481dde66SAndroid Build Coastguard Worker* If enough projects want to use the same interface, they can always share it, 616*481dde66SAndroid Build Coastguard Worker just like they have been sharing `Concrete`. You can check in the interface 617*481dde66SAndroid Build Coastguard Worker and the adaptor somewhere near `Concrete` (perhaps in a `contrib` 618*481dde66SAndroid Build Coastguard Worker sub-directory) and let many projects use it. 619*481dde66SAndroid Build Coastguard Worker 620*481dde66SAndroid Build Coastguard WorkerYou need to weigh the pros and cons carefully for your particular problem, but 621*481dde66SAndroid Build Coastguard WorkerI'd like to assure you that the Java community has been practicing this for a 622*481dde66SAndroid Build Coastguard Workerlong time and it's a proven effective technique applicable in a wide variety of 623*481dde66SAndroid Build Coastguard Workersituations. :-) 624*481dde66SAndroid Build Coastguard Worker 625*481dde66SAndroid Build Coastguard Worker### Delegating Calls to a Fake {#DelegatingToFake} 626*481dde66SAndroid Build Coastguard Worker 627*481dde66SAndroid Build Coastguard WorkerSome times you have a non-trivial fake implementation of an interface. For 628*481dde66SAndroid Build Coastguard Workerexample: 629*481dde66SAndroid Build Coastguard Worker 630*481dde66SAndroid Build Coastguard Worker```cpp 631*481dde66SAndroid Build Coastguard Workerclass Foo { 632*481dde66SAndroid Build Coastguard Worker public: 633*481dde66SAndroid Build Coastguard Worker virtual ~Foo() {} 634*481dde66SAndroid Build Coastguard Worker virtual char DoThis(int n) = 0; 635*481dde66SAndroid Build Coastguard Worker virtual void DoThat(const char* s, int* p) = 0; 636*481dde66SAndroid Build Coastguard Worker}; 637*481dde66SAndroid Build Coastguard Worker 638*481dde66SAndroid Build Coastguard Workerclass FakeFoo : public Foo { 639*481dde66SAndroid Build Coastguard Worker public: 640*481dde66SAndroid Build Coastguard Worker char DoThis(int n) override { 641*481dde66SAndroid Build Coastguard Worker return (n > 0) ? '+' : 642*481dde66SAndroid Build Coastguard Worker (n < 0) ? '-' : '0'; 643*481dde66SAndroid Build Coastguard Worker } 644*481dde66SAndroid Build Coastguard Worker 645*481dde66SAndroid Build Coastguard Worker void DoThat(const char* s, int* p) override { 646*481dde66SAndroid Build Coastguard Worker *p = strlen(s); 647*481dde66SAndroid Build Coastguard Worker } 648*481dde66SAndroid Build Coastguard Worker}; 649*481dde66SAndroid Build Coastguard Worker``` 650*481dde66SAndroid Build Coastguard Worker 651*481dde66SAndroid Build Coastguard WorkerNow you want to mock this interface such that you can set expectations on it. 652*481dde66SAndroid Build Coastguard WorkerHowever, you also want to use `FakeFoo` for the default behavior, as duplicating 653*481dde66SAndroid Build Coastguard Workerit in the mock object is, well, a lot of work. 654*481dde66SAndroid Build Coastguard Worker 655*481dde66SAndroid Build Coastguard WorkerWhen you define the mock class using gMock, you can have it delegate its default 656*481dde66SAndroid Build Coastguard Workeraction to a fake class you already have, using this pattern: 657*481dde66SAndroid Build Coastguard Worker 658*481dde66SAndroid Build Coastguard Worker```cpp 659*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 660*481dde66SAndroid Build Coastguard Worker public: 661*481dde66SAndroid Build Coastguard Worker // Normal mock method definitions using gMock. 662*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(char, DoThis, (int n), (override)); 663*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, DoThat, (const char* s, int* p), (override)); 664*481dde66SAndroid Build Coastguard Worker 665*481dde66SAndroid Build Coastguard Worker // Delegates the default actions of the methods to a FakeFoo object. 666*481dde66SAndroid Build Coastguard Worker // This must be called *before* the custom ON_CALL() statements. 667*481dde66SAndroid Build Coastguard Worker void DelegateToFake() { 668*481dde66SAndroid Build Coastguard Worker ON_CALL(*this, DoThis).WillByDefault([this](int n) { 669*481dde66SAndroid Build Coastguard Worker return fake_.DoThis(n); 670*481dde66SAndroid Build Coastguard Worker }); 671*481dde66SAndroid Build Coastguard Worker ON_CALL(*this, DoThat).WillByDefault([this](const char* s, int* p) { 672*481dde66SAndroid Build Coastguard Worker fake_.DoThat(s, p); 673*481dde66SAndroid Build Coastguard Worker }); 674*481dde66SAndroid Build Coastguard Worker } 675*481dde66SAndroid Build Coastguard Worker 676*481dde66SAndroid Build Coastguard Worker private: 677*481dde66SAndroid Build Coastguard Worker FakeFoo fake_; // Keeps an instance of the fake in the mock. 678*481dde66SAndroid Build Coastguard Worker}; 679*481dde66SAndroid Build Coastguard Worker``` 680*481dde66SAndroid Build Coastguard Worker 681*481dde66SAndroid Build Coastguard WorkerWith that, you can use `MockFoo` in your tests as usual. Just remember that if 682*481dde66SAndroid Build Coastguard Workeryou don't explicitly set an action in an `ON_CALL()` or `EXPECT_CALL()`, the 683*481dde66SAndroid Build Coastguard Workerfake will be called upon to do it.: 684*481dde66SAndroid Build Coastguard Worker 685*481dde66SAndroid Build Coastguard Worker```cpp 686*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 687*481dde66SAndroid Build Coastguard Worker 688*481dde66SAndroid Build Coastguard WorkerTEST(AbcTest, Xyz) { 689*481dde66SAndroid Build Coastguard Worker MockFoo foo; 690*481dde66SAndroid Build Coastguard Worker 691*481dde66SAndroid Build Coastguard Worker foo.DelegateToFake(); // Enables the fake for delegation. 692*481dde66SAndroid Build Coastguard Worker 693*481dde66SAndroid Build Coastguard Worker // Put your ON_CALL(foo, ...)s here, if any. 694*481dde66SAndroid Build Coastguard Worker 695*481dde66SAndroid Build Coastguard Worker // No action specified, meaning to use the default action. 696*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(5)); 697*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThat(_, _)); 698*481dde66SAndroid Build Coastguard Worker 699*481dde66SAndroid Build Coastguard Worker int n = 0; 700*481dde66SAndroid Build Coastguard Worker EXPECT_EQ(foo.DoThis(5), '+'); // FakeFoo::DoThis() is invoked. 701*481dde66SAndroid Build Coastguard Worker foo.DoThat("Hi", &n); // FakeFoo::DoThat() is invoked. 702*481dde66SAndroid Build Coastguard Worker EXPECT_EQ(n, 2); 703*481dde66SAndroid Build Coastguard Worker} 704*481dde66SAndroid Build Coastguard Worker``` 705*481dde66SAndroid Build Coastguard Worker 706*481dde66SAndroid Build Coastguard Worker**Some tips:** 707*481dde66SAndroid Build Coastguard Worker 708*481dde66SAndroid Build Coastguard Worker* If you want, you can still override the default action by providing your own 709*481dde66SAndroid Build Coastguard Worker `ON_CALL()` or using `.WillOnce()` / `.WillRepeatedly()` in `EXPECT_CALL()`. 710*481dde66SAndroid Build Coastguard Worker* In `DelegateToFake()`, you only need to delegate the methods whose fake 711*481dde66SAndroid Build Coastguard Worker implementation you intend to use. 712*481dde66SAndroid Build Coastguard Worker 713*481dde66SAndroid Build Coastguard Worker* The general technique discussed here works for overloaded methods, but 714*481dde66SAndroid Build Coastguard Worker you'll need to tell the compiler which version you mean. To disambiguate a 715*481dde66SAndroid Build Coastguard Worker mock function (the one you specify inside the parentheses of `ON_CALL()`), 716*481dde66SAndroid Build Coastguard Worker use [this technique](#SelectOverload); to disambiguate a fake function (the 717*481dde66SAndroid Build Coastguard Worker one you place inside `Invoke()`), use a `static_cast` to specify the 718*481dde66SAndroid Build Coastguard Worker function's type. For instance, if class `Foo` has methods `char DoThis(int 719*481dde66SAndroid Build Coastguard Worker n)` and `bool DoThis(double x) const`, and you want to invoke the latter, 720*481dde66SAndroid Build Coastguard Worker you need to write `Invoke(&fake_, static_cast<bool (FakeFoo::*)(double) 721*481dde66SAndroid Build Coastguard Worker const>(&FakeFoo::DoThis))` instead of `Invoke(&fake_, &FakeFoo::DoThis)` 722*481dde66SAndroid Build Coastguard Worker (The strange-looking thing inside the angled brackets of `static_cast` is 723*481dde66SAndroid Build Coastguard Worker the type of a function pointer to the second `DoThis()` method.). 724*481dde66SAndroid Build Coastguard Worker 725*481dde66SAndroid Build Coastguard Worker* Having to mix a mock and a fake is often a sign of something gone wrong. 726*481dde66SAndroid Build Coastguard Worker Perhaps you haven't got used to the interaction-based way of testing yet. Or 727*481dde66SAndroid Build Coastguard Worker perhaps your interface is taking on too many roles and should be split up. 728*481dde66SAndroid Build Coastguard Worker Therefore, **don't abuse this**. We would only recommend to do it as an 729*481dde66SAndroid Build Coastguard Worker intermediate step when you are refactoring your code. 730*481dde66SAndroid Build Coastguard Worker 731*481dde66SAndroid Build Coastguard WorkerRegarding the tip on mixing a mock and a fake, here's an example on why it may 732*481dde66SAndroid Build Coastguard Workerbe a bad sign: Suppose you have a class `System` for low-level system 733*481dde66SAndroid Build Coastguard Workeroperations. In particular, it does file and I/O operations. And suppose you want 734*481dde66SAndroid Build Coastguard Workerto test how your code uses `System` to do I/O, and you just want the file 735*481dde66SAndroid Build Coastguard Workeroperations to work normally. If you mock out the entire `System` class, you'll 736*481dde66SAndroid Build Coastguard Workerhave to provide a fake implementation for the file operation part, which 737*481dde66SAndroid Build Coastguard Workersuggests that `System` is taking on too many roles. 738*481dde66SAndroid Build Coastguard Worker 739*481dde66SAndroid Build Coastguard WorkerInstead, you can define a `FileOps` interface and an `IOOps` interface and split 740*481dde66SAndroid Build Coastguard Worker`System`'s functionalities into the two. Then you can mock `IOOps` without 741*481dde66SAndroid Build Coastguard Workermocking `FileOps`. 742*481dde66SAndroid Build Coastguard Worker 743*481dde66SAndroid Build Coastguard Worker### Delegating Calls to a Real Object 744*481dde66SAndroid Build Coastguard Worker 745*481dde66SAndroid Build Coastguard WorkerWhen using testing doubles (mocks, fakes, stubs, and etc), sometimes their 746*481dde66SAndroid Build Coastguard Workerbehaviors will differ from those of the real objects. This difference could be 747*481dde66SAndroid Build Coastguard Workereither intentional (as in simulating an error such that you can test the error 748*481dde66SAndroid Build Coastguard Workerhandling code) or unintentional. If your mocks have different behaviors than the 749*481dde66SAndroid Build Coastguard Workerreal objects by mistake, you could end up with code that passes the tests but 750*481dde66SAndroid Build Coastguard Workerfails in production. 751*481dde66SAndroid Build Coastguard Worker 752*481dde66SAndroid Build Coastguard WorkerYou can use the *delegating-to-real* technique to ensure that your mock has the 753*481dde66SAndroid Build Coastguard Workersame behavior as the real object while retaining the ability to validate calls. 754*481dde66SAndroid Build Coastguard WorkerThis technique is very similar to the [delegating-to-fake](#DelegatingToFake) 755*481dde66SAndroid Build Coastguard Workertechnique, the difference being that we use a real object instead of a fake. 756*481dde66SAndroid Build Coastguard WorkerHere's an example: 757*481dde66SAndroid Build Coastguard Worker 758*481dde66SAndroid Build Coastguard Worker```cpp 759*481dde66SAndroid Build Coastguard Workerusing ::testing::AtLeast; 760*481dde66SAndroid Build Coastguard Worker 761*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 762*481dde66SAndroid Build Coastguard Worker public: 763*481dde66SAndroid Build Coastguard Worker MockFoo() { 764*481dde66SAndroid Build Coastguard Worker // By default, all calls are delegated to the real object. 765*481dde66SAndroid Build Coastguard Worker ON_CALL(*this, DoThis).WillByDefault([this](int n) { 766*481dde66SAndroid Build Coastguard Worker return real_.DoThis(n); 767*481dde66SAndroid Build Coastguard Worker }); 768*481dde66SAndroid Build Coastguard Worker ON_CALL(*this, DoThat).WillByDefault([this](const char* s, int* p) { 769*481dde66SAndroid Build Coastguard Worker real_.DoThat(s, p); 770*481dde66SAndroid Build Coastguard Worker }); 771*481dde66SAndroid Build Coastguard Worker ... 772*481dde66SAndroid Build Coastguard Worker } 773*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(char, DoThis, ...); 774*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, DoThat, ...); 775*481dde66SAndroid Build Coastguard Worker ... 776*481dde66SAndroid Build Coastguard Worker private: 777*481dde66SAndroid Build Coastguard Worker Foo real_; 778*481dde66SAndroid Build Coastguard Worker}; 779*481dde66SAndroid Build Coastguard Worker 780*481dde66SAndroid Build Coastguard Worker... 781*481dde66SAndroid Build Coastguard Worker MockFoo mock; 782*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, DoThis()) 783*481dde66SAndroid Build Coastguard Worker .Times(3); 784*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, DoThat("Hi")) 785*481dde66SAndroid Build Coastguard Worker .Times(AtLeast(1)); 786*481dde66SAndroid Build Coastguard Worker ... use mock in test ... 787*481dde66SAndroid Build Coastguard Worker``` 788*481dde66SAndroid Build Coastguard Worker 789*481dde66SAndroid Build Coastguard WorkerWith this, gMock will verify that your code made the right calls (with the right 790*481dde66SAndroid Build Coastguard Workerarguments, in the right order, called the right number of times, etc), and a 791*481dde66SAndroid Build Coastguard Workerreal object will answer the calls (so the behavior will be the same as in 792*481dde66SAndroid Build Coastguard Workerproduction). This gives you the best of both worlds. 793*481dde66SAndroid Build Coastguard Worker 794*481dde66SAndroid Build Coastguard Worker### Delegating Calls to a Parent Class 795*481dde66SAndroid Build Coastguard Worker 796*481dde66SAndroid Build Coastguard WorkerIdeally, you should code to interfaces, whose methods are all pure virtual. In 797*481dde66SAndroid Build Coastguard Workerreality, sometimes you do need to mock a virtual method that is not pure (i.e, 798*481dde66SAndroid Build Coastguard Workerit already has an implementation). For example: 799*481dde66SAndroid Build Coastguard Worker 800*481dde66SAndroid Build Coastguard Worker```cpp 801*481dde66SAndroid Build Coastguard Workerclass Foo { 802*481dde66SAndroid Build Coastguard Worker public: 803*481dde66SAndroid Build Coastguard Worker virtual ~Foo(); 804*481dde66SAndroid Build Coastguard Worker 805*481dde66SAndroid Build Coastguard Worker virtual void Pure(int n) = 0; 806*481dde66SAndroid Build Coastguard Worker virtual int Concrete(const char* str) { ... } 807*481dde66SAndroid Build Coastguard Worker}; 808*481dde66SAndroid Build Coastguard Worker 809*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 810*481dde66SAndroid Build Coastguard Worker public: 811*481dde66SAndroid Build Coastguard Worker // Mocking a pure method. 812*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Pure, (int n), (override)); 813*481dde66SAndroid Build Coastguard Worker // Mocking a concrete method. Foo::Concrete() is shadowed. 814*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(int, Concrete, (const char* str), (override)); 815*481dde66SAndroid Build Coastguard Worker}; 816*481dde66SAndroid Build Coastguard Worker``` 817*481dde66SAndroid Build Coastguard Worker 818*481dde66SAndroid Build Coastguard WorkerSometimes you may want to call `Foo::Concrete()` instead of 819*481dde66SAndroid Build Coastguard Worker`MockFoo::Concrete()`. Perhaps you want to do it as part of a stub action, or 820*481dde66SAndroid Build Coastguard Workerperhaps your test doesn't need to mock `Concrete()` at all (but it would be 821*481dde66SAndroid Build Coastguard Workeroh-so painful to have to define a new mock class whenever you don't need to mock 822*481dde66SAndroid Build Coastguard Workerone of its methods). 823*481dde66SAndroid Build Coastguard Worker 824*481dde66SAndroid Build Coastguard WorkerYou can call `Foo::Concrete()` inside an action by: 825*481dde66SAndroid Build Coastguard Worker 826*481dde66SAndroid Build Coastguard Worker```cpp 827*481dde66SAndroid Build Coastguard Worker... 828*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Concrete).WillOnce([&foo](const char* str) { 829*481dde66SAndroid Build Coastguard Worker return foo.Foo::Concrete(str); 830*481dde66SAndroid Build Coastguard Worker }); 831*481dde66SAndroid Build Coastguard Worker``` 832*481dde66SAndroid Build Coastguard Worker 833*481dde66SAndroid Build Coastguard Workeror tell the mock object that you don't want to mock `Concrete()`: 834*481dde66SAndroid Build Coastguard Worker 835*481dde66SAndroid Build Coastguard Worker```cpp 836*481dde66SAndroid Build Coastguard Worker... 837*481dde66SAndroid Build Coastguard Worker ON_CALL(foo, Concrete).WillByDefault([&foo](const char* str) { 838*481dde66SAndroid Build Coastguard Worker return foo.Foo::Concrete(str); 839*481dde66SAndroid Build Coastguard Worker }); 840*481dde66SAndroid Build Coastguard Worker``` 841*481dde66SAndroid Build Coastguard Worker 842*481dde66SAndroid Build Coastguard Worker(Why don't we just write `{ return foo.Concrete(str); }`? If you do that, 843*481dde66SAndroid Build Coastguard Worker`MockFoo::Concrete()` will be called (and cause an infinite recursion) since 844*481dde66SAndroid Build Coastguard Worker`Foo::Concrete()` is virtual. That's just how C++ works.) 845*481dde66SAndroid Build Coastguard Worker 846*481dde66SAndroid Build Coastguard Worker## Using Matchers 847*481dde66SAndroid Build Coastguard Worker 848*481dde66SAndroid Build Coastguard Worker### Matching Argument Values Exactly 849*481dde66SAndroid Build Coastguard Worker 850*481dde66SAndroid Build Coastguard WorkerYou can specify exactly which arguments a mock method is expecting: 851*481dde66SAndroid Build Coastguard Worker 852*481dde66SAndroid Build Coastguard Worker```cpp 853*481dde66SAndroid Build Coastguard Workerusing ::testing::Return; 854*481dde66SAndroid Build Coastguard Worker... 855*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(5)) 856*481dde66SAndroid Build Coastguard Worker .WillOnce(Return('a')); 857*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThat("Hello", bar)); 858*481dde66SAndroid Build Coastguard Worker``` 859*481dde66SAndroid Build Coastguard Worker 860*481dde66SAndroid Build Coastguard Worker### Using Simple Matchers 861*481dde66SAndroid Build Coastguard Worker 862*481dde66SAndroid Build Coastguard WorkerYou can use matchers to match arguments that have a certain property: 863*481dde66SAndroid Build Coastguard Worker 864*481dde66SAndroid Build Coastguard Worker```cpp 865*481dde66SAndroid Build Coastguard Workerusing ::testing::NotNull; 866*481dde66SAndroid Build Coastguard Workerusing ::testing::Return; 867*481dde66SAndroid Build Coastguard Worker... 868*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(Ge(5))) // The argument must be >= 5. 869*481dde66SAndroid Build Coastguard Worker .WillOnce(Return('a')); 870*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThat("Hello", NotNull())); 871*481dde66SAndroid Build Coastguard Worker // The second argument must not be NULL. 872*481dde66SAndroid Build Coastguard Worker``` 873*481dde66SAndroid Build Coastguard Worker 874*481dde66SAndroid Build Coastguard WorkerA frequently used matcher is `_`, which matches anything: 875*481dde66SAndroid Build Coastguard Worker 876*481dde66SAndroid Build Coastguard Worker```cpp 877*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThat(_, NotNull())); 878*481dde66SAndroid Build Coastguard Worker``` 879*481dde66SAndroid Build Coastguard Worker 880*481dde66SAndroid Build Coastguard Worker### Combining Matchers {#CombiningMatchers} 881*481dde66SAndroid Build Coastguard Worker 882*481dde66SAndroid Build Coastguard WorkerYou can build complex matchers from existing ones using `AllOf()`, 883*481dde66SAndroid Build Coastguard Worker`AllOfArray()`, `AnyOf()`, `AnyOfArray()` and `Not()`: 884*481dde66SAndroid Build Coastguard Worker 885*481dde66SAndroid Build Coastguard Worker```cpp 886*481dde66SAndroid Build Coastguard Workerusing ::testing::AllOf; 887*481dde66SAndroid Build Coastguard Workerusing ::testing::Gt; 888*481dde66SAndroid Build Coastguard Workerusing ::testing::HasSubstr; 889*481dde66SAndroid Build Coastguard Workerusing ::testing::Ne; 890*481dde66SAndroid Build Coastguard Workerusing ::testing::Not; 891*481dde66SAndroid Build Coastguard Worker... 892*481dde66SAndroid Build Coastguard Worker // The argument must be > 5 and != 10. 893*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(AllOf(Gt(5), 894*481dde66SAndroid Build Coastguard Worker Ne(10)))); 895*481dde66SAndroid Build Coastguard Worker 896*481dde66SAndroid Build Coastguard Worker // The first argument must not contain sub-string "blah". 897*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThat(Not(HasSubstr("blah")), 898*481dde66SAndroid Build Coastguard Worker NULL)); 899*481dde66SAndroid Build Coastguard Worker``` 900*481dde66SAndroid Build Coastguard Worker 901*481dde66SAndroid Build Coastguard WorkerMatchers are function objects, and parametrized matchers can be composed just 902*481dde66SAndroid Build Coastguard Workerlike any other function. However because their types can be long and rarely 903*481dde66SAndroid Build Coastguard Workerprovide meaningful information, it can be easier to express them with C++14 904*481dde66SAndroid Build Coastguard Workergeneric lambdas to avoid specifying types. For example, 905*481dde66SAndroid Build Coastguard Worker 906*481dde66SAndroid Build Coastguard Worker```cpp 907*481dde66SAndroid Build Coastguard Workerusing ::testing::Contains; 908*481dde66SAndroid Build Coastguard Workerusing ::testing::Property; 909*481dde66SAndroid Build Coastguard Worker 910*481dde66SAndroid Build Coastguard Workerinline constexpr auto HasFoo = [](const auto& f) { 911*481dde66SAndroid Build Coastguard Worker return Property("foo", &MyClass::foo, Contains(f)); 912*481dde66SAndroid Build Coastguard Worker}; 913*481dde66SAndroid Build Coastguard Worker... 914*481dde66SAndroid Build Coastguard Worker EXPECT_THAT(x, HasFoo("blah")); 915*481dde66SAndroid Build Coastguard Worker``` 916*481dde66SAndroid Build Coastguard Worker 917*481dde66SAndroid Build Coastguard Worker### Casting Matchers {#SafeMatcherCast} 918*481dde66SAndroid Build Coastguard Worker 919*481dde66SAndroid Build Coastguard WorkergMock matchers are statically typed, meaning that the compiler can catch your 920*481dde66SAndroid Build Coastguard Workermistake if you use a matcher of the wrong type (for example, if you use `Eq(5)` 921*481dde66SAndroid Build Coastguard Workerto match a `string` argument). Good for you! 922*481dde66SAndroid Build Coastguard Worker 923*481dde66SAndroid Build Coastguard WorkerSometimes, however, you know what you're doing and want the compiler to give you 924*481dde66SAndroid Build Coastguard Workersome slack. One example is that you have a matcher for `long` and the argument 925*481dde66SAndroid Build Coastguard Workeryou want to match is `int`. While the two types aren't exactly the same, there 926*481dde66SAndroid Build Coastguard Workeris nothing really wrong with using a `Matcher<long>` to match an `int` - after 927*481dde66SAndroid Build Coastguard Workerall, we can first convert the `int` argument to a `long` losslessly before 928*481dde66SAndroid Build Coastguard Workergiving it to the matcher. 929*481dde66SAndroid Build Coastguard Worker 930*481dde66SAndroid Build Coastguard WorkerTo support this need, gMock gives you the `SafeMatcherCast<T>(m)` function. It 931*481dde66SAndroid Build Coastguard Workercasts a matcher `m` to type `Matcher<T>`. To ensure safety, gMock checks that 932*481dde66SAndroid Build Coastguard Worker(let `U` be the type `m` accepts : 933*481dde66SAndroid Build Coastguard Worker 934*481dde66SAndroid Build Coastguard Worker1. Type `T` can be *implicitly* cast to type `U`; 935*481dde66SAndroid Build Coastguard Worker2. When both `T` and `U` are built-in arithmetic types (`bool`, integers, and 936*481dde66SAndroid Build Coastguard Worker floating-point numbers), the conversion from `T` to `U` is not lossy (in 937*481dde66SAndroid Build Coastguard Worker other words, any value representable by `T` can also be represented by `U`); 938*481dde66SAndroid Build Coastguard Worker and 939*481dde66SAndroid Build Coastguard Worker3. When `U` is a reference, `T` must also be a reference (as the underlying 940*481dde66SAndroid Build Coastguard Worker matcher may be interested in the address of the `U` value). 941*481dde66SAndroid Build Coastguard Worker 942*481dde66SAndroid Build Coastguard WorkerThe code won't compile if any of these conditions isn't met. 943*481dde66SAndroid Build Coastguard Worker 944*481dde66SAndroid Build Coastguard WorkerHere's one example: 945*481dde66SAndroid Build Coastguard Worker 946*481dde66SAndroid Build Coastguard Worker```cpp 947*481dde66SAndroid Build Coastguard Workerusing ::testing::SafeMatcherCast; 948*481dde66SAndroid Build Coastguard Worker 949*481dde66SAndroid Build Coastguard Worker// A base class and a child class. 950*481dde66SAndroid Build Coastguard Workerclass Base { ... }; 951*481dde66SAndroid Build Coastguard Workerclass Derived : public Base { ... }; 952*481dde66SAndroid Build Coastguard Worker 953*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 954*481dde66SAndroid Build Coastguard Worker public: 955*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, DoThis, (Derived* derived), (override)); 956*481dde66SAndroid Build Coastguard Worker}; 957*481dde66SAndroid Build Coastguard Worker 958*481dde66SAndroid Build Coastguard Worker... 959*481dde66SAndroid Build Coastguard Worker MockFoo foo; 960*481dde66SAndroid Build Coastguard Worker // m is a Matcher<Base*> we got from somewhere. 961*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(SafeMatcherCast<Derived*>(m))); 962*481dde66SAndroid Build Coastguard Worker``` 963*481dde66SAndroid Build Coastguard Worker 964*481dde66SAndroid Build Coastguard WorkerIf you find `SafeMatcherCast<T>(m)` too limiting, you can use a similar function 965*481dde66SAndroid Build Coastguard Worker`MatcherCast<T>(m)`. The difference is that `MatcherCast` works as long as you 966*481dde66SAndroid Build Coastguard Workercan `static_cast` type `T` to type `U`. 967*481dde66SAndroid Build Coastguard Worker 968*481dde66SAndroid Build Coastguard Worker`MatcherCast` essentially lets you bypass C++'s type system (`static_cast` isn't 969*481dde66SAndroid Build Coastguard Workeralways safe as it could throw away information, for example), so be careful not 970*481dde66SAndroid Build Coastguard Workerto misuse/abuse it. 971*481dde66SAndroid Build Coastguard Worker 972*481dde66SAndroid Build Coastguard Worker### Selecting Between Overloaded Functions {#SelectOverload} 973*481dde66SAndroid Build Coastguard Worker 974*481dde66SAndroid Build Coastguard WorkerIf you expect an overloaded function to be called, the compiler may need some 975*481dde66SAndroid Build Coastguard Workerhelp on which overloaded version it is. 976*481dde66SAndroid Build Coastguard Worker 977*481dde66SAndroid Build Coastguard WorkerTo disambiguate functions overloaded on the const-ness of this object, use the 978*481dde66SAndroid Build Coastguard Worker`Const()` argument wrapper. 979*481dde66SAndroid Build Coastguard Worker 980*481dde66SAndroid Build Coastguard Worker```cpp 981*481dde66SAndroid Build Coastguard Workerusing ::testing::ReturnRef; 982*481dde66SAndroid Build Coastguard Worker 983*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 984*481dde66SAndroid Build Coastguard Worker ... 985*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(Bar&, GetBar, (), (override)); 986*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(const Bar&, GetBar, (), (const, override)); 987*481dde66SAndroid Build Coastguard Worker}; 988*481dde66SAndroid Build Coastguard Worker 989*481dde66SAndroid Build Coastguard Worker... 990*481dde66SAndroid Build Coastguard Worker MockFoo foo; 991*481dde66SAndroid Build Coastguard Worker Bar bar1, bar2; 992*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, GetBar()) // The non-const GetBar(). 993*481dde66SAndroid Build Coastguard Worker .WillOnce(ReturnRef(bar1)); 994*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(Const(foo), GetBar()) // The const GetBar(). 995*481dde66SAndroid Build Coastguard Worker .WillOnce(ReturnRef(bar2)); 996*481dde66SAndroid Build Coastguard Worker``` 997*481dde66SAndroid Build Coastguard Worker 998*481dde66SAndroid Build Coastguard Worker(`Const()` is defined by gMock and returns a `const` reference to its argument.) 999*481dde66SAndroid Build Coastguard Worker 1000*481dde66SAndroid Build Coastguard WorkerTo disambiguate overloaded functions with the same number of arguments but 1001*481dde66SAndroid Build Coastguard Workerdifferent argument types, you may need to specify the exact type of a matcher, 1002*481dde66SAndroid Build Coastguard Workereither by wrapping your matcher in `Matcher<type>()`, or using a matcher whose 1003*481dde66SAndroid Build Coastguard Workertype is fixed (`TypedEq<type>`, `An<type>()`, etc): 1004*481dde66SAndroid Build Coastguard Worker 1005*481dde66SAndroid Build Coastguard Worker```cpp 1006*481dde66SAndroid Build Coastguard Workerusing ::testing::An; 1007*481dde66SAndroid Build Coastguard Workerusing ::testing::Matcher; 1008*481dde66SAndroid Build Coastguard Workerusing ::testing::TypedEq; 1009*481dde66SAndroid Build Coastguard Worker 1010*481dde66SAndroid Build Coastguard Workerclass MockPrinter : public Printer { 1011*481dde66SAndroid Build Coastguard Worker public: 1012*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Print, (int n), (override)); 1013*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Print, (char c), (override)); 1014*481dde66SAndroid Build Coastguard Worker}; 1015*481dde66SAndroid Build Coastguard Worker 1016*481dde66SAndroid Build Coastguard WorkerTEST(PrinterTest, Print) { 1017*481dde66SAndroid Build Coastguard Worker MockPrinter printer; 1018*481dde66SAndroid Build Coastguard Worker 1019*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(printer, Print(An<int>())); // void Print(int); 1020*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(printer, Print(Matcher<int>(Lt(5)))); // void Print(int); 1021*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(printer, Print(TypedEq<char>('a'))); // void Print(char); 1022*481dde66SAndroid Build Coastguard Worker 1023*481dde66SAndroid Build Coastguard Worker printer.Print(3); 1024*481dde66SAndroid Build Coastguard Worker printer.Print(6); 1025*481dde66SAndroid Build Coastguard Worker printer.Print('a'); 1026*481dde66SAndroid Build Coastguard Worker} 1027*481dde66SAndroid Build Coastguard Worker``` 1028*481dde66SAndroid Build Coastguard Worker 1029*481dde66SAndroid Build Coastguard Worker### Performing Different Actions Based on the Arguments 1030*481dde66SAndroid Build Coastguard Worker 1031*481dde66SAndroid Build Coastguard WorkerWhen a mock method is called, the *last* matching expectation that's still 1032*481dde66SAndroid Build Coastguard Workeractive will be selected (think "newer overrides older"). So, you can make a 1033*481dde66SAndroid Build Coastguard Workermethod do different things depending on its argument values like this: 1034*481dde66SAndroid Build Coastguard Worker 1035*481dde66SAndroid Build Coastguard Worker```cpp 1036*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1037*481dde66SAndroid Build Coastguard Workerusing ::testing::Lt; 1038*481dde66SAndroid Build Coastguard Workerusing ::testing::Return; 1039*481dde66SAndroid Build Coastguard Worker... 1040*481dde66SAndroid Build Coastguard Worker // The default case. 1041*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(_)) 1042*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(Return('b')); 1043*481dde66SAndroid Build Coastguard Worker // The more specific case. 1044*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(Lt(5))) 1045*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(Return('a')); 1046*481dde66SAndroid Build Coastguard Worker``` 1047*481dde66SAndroid Build Coastguard Worker 1048*481dde66SAndroid Build Coastguard WorkerNow, if `foo.DoThis()` is called with a value less than 5, `'a'` will be 1049*481dde66SAndroid Build Coastguard Workerreturned; otherwise `'b'` will be returned. 1050*481dde66SAndroid Build Coastguard Worker 1051*481dde66SAndroid Build Coastguard Worker### Matching Multiple Arguments as a Whole 1052*481dde66SAndroid Build Coastguard Worker 1053*481dde66SAndroid Build Coastguard WorkerSometimes it's not enough to match the arguments individually. For example, we 1054*481dde66SAndroid Build Coastguard Workermay want to say that the first argument must be less than the second argument. 1055*481dde66SAndroid Build Coastguard WorkerThe `With()` clause allows us to match all arguments of a mock function as a 1056*481dde66SAndroid Build Coastguard Workerwhole. For example, 1057*481dde66SAndroid Build Coastguard Worker 1058*481dde66SAndroid Build Coastguard Worker```cpp 1059*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1060*481dde66SAndroid Build Coastguard Workerusing ::testing::Ne; 1061*481dde66SAndroid Build Coastguard Workerusing ::testing::Lt; 1062*481dde66SAndroid Build Coastguard Worker... 1063*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, InRange(Ne(0), _)) 1064*481dde66SAndroid Build Coastguard Worker .With(Lt()); 1065*481dde66SAndroid Build Coastguard Worker``` 1066*481dde66SAndroid Build Coastguard Worker 1067*481dde66SAndroid Build Coastguard Workersays that the first argument of `InRange()` must not be 0, and must be less than 1068*481dde66SAndroid Build Coastguard Workerthe second argument. 1069*481dde66SAndroid Build Coastguard Worker 1070*481dde66SAndroid Build Coastguard WorkerThe expression inside `With()` must be a matcher of type `Matcher<std::tuple<A1, 1071*481dde66SAndroid Build Coastguard Worker..., An>>`, where `A1`, ..., `An` are the types of the function arguments. 1072*481dde66SAndroid Build Coastguard Worker 1073*481dde66SAndroid Build Coastguard WorkerYou can also write `AllArgs(m)` instead of `m` inside `.With()`. The two forms 1074*481dde66SAndroid Build Coastguard Workerare equivalent, but `.With(AllArgs(Lt()))` is more readable than `.With(Lt())`. 1075*481dde66SAndroid Build Coastguard Worker 1076*481dde66SAndroid Build Coastguard WorkerYou can use `Args<k1, ..., kn>(m)` to match the `n` selected arguments (as a 1077*481dde66SAndroid Build Coastguard Workertuple) against `m`. For example, 1078*481dde66SAndroid Build Coastguard Worker 1079*481dde66SAndroid Build Coastguard Worker```cpp 1080*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1081*481dde66SAndroid Build Coastguard Workerusing ::testing::AllOf; 1082*481dde66SAndroid Build Coastguard Workerusing ::testing::Args; 1083*481dde66SAndroid Build Coastguard Workerusing ::testing::Lt; 1084*481dde66SAndroid Build Coastguard Worker... 1085*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Blah) 1086*481dde66SAndroid Build Coastguard Worker .With(AllOf(Args<0, 1>(Lt()), Args<1, 2>(Lt()))); 1087*481dde66SAndroid Build Coastguard Worker``` 1088*481dde66SAndroid Build Coastguard Worker 1089*481dde66SAndroid Build Coastguard Workersays that `Blah` will be called with arguments `x`, `y`, and `z` where `x < y < 1090*481dde66SAndroid Build Coastguard Workerz`. Note that in this example, it wasn't necessary to specify the positional 1091*481dde66SAndroid Build Coastguard Workermatchers. 1092*481dde66SAndroid Build Coastguard Worker 1093*481dde66SAndroid Build Coastguard WorkerAs a convenience and example, gMock provides some matchers for 2-tuples, 1094*481dde66SAndroid Build Coastguard Workerincluding the `Lt()` matcher above. See 1095*481dde66SAndroid Build Coastguard Worker[Multi-argument Matchers](reference/matchers.md#MultiArgMatchers) for the 1096*481dde66SAndroid Build Coastguard Workercomplete list. 1097*481dde66SAndroid Build Coastguard Worker 1098*481dde66SAndroid Build Coastguard WorkerNote that if you want to pass the arguments to a predicate of your own (e.g. 1099*481dde66SAndroid Build Coastguard Worker`.With(Args<0, 1>(Truly(&MyPredicate)))`), that predicate MUST be written to 1100*481dde66SAndroid Build Coastguard Workertake a `std::tuple` as its argument; gMock will pass the `n` selected arguments 1101*481dde66SAndroid Build Coastguard Workeras *one* single tuple to the predicate. 1102*481dde66SAndroid Build Coastguard Worker 1103*481dde66SAndroid Build Coastguard Worker### Using Matchers as Predicates 1104*481dde66SAndroid Build Coastguard Worker 1105*481dde66SAndroid Build Coastguard WorkerHave you noticed that a matcher is just a fancy predicate that also knows how to 1106*481dde66SAndroid Build Coastguard Workerdescribe itself? Many existing algorithms take predicates as arguments (e.g. 1107*481dde66SAndroid Build Coastguard Workerthose defined in STL's `<algorithm>` header), and it would be a shame if gMock 1108*481dde66SAndroid Build Coastguard Workermatchers were not allowed to participate. 1109*481dde66SAndroid Build Coastguard Worker 1110*481dde66SAndroid Build Coastguard WorkerLuckily, you can use a matcher where a unary predicate functor is expected by 1111*481dde66SAndroid Build Coastguard Workerwrapping it inside the `Matches()` function. For example, 1112*481dde66SAndroid Build Coastguard Worker 1113*481dde66SAndroid Build Coastguard Worker```cpp 1114*481dde66SAndroid Build Coastguard Worker#include <algorithm> 1115*481dde66SAndroid Build Coastguard Worker#include <vector> 1116*481dde66SAndroid Build Coastguard Worker 1117*481dde66SAndroid Build Coastguard Workerusing ::testing::Matches; 1118*481dde66SAndroid Build Coastguard Workerusing ::testing::Ge; 1119*481dde66SAndroid Build Coastguard Worker 1120*481dde66SAndroid Build Coastguard Workervector<int> v; 1121*481dde66SAndroid Build Coastguard Worker... 1122*481dde66SAndroid Build Coastguard Worker// How many elements in v are >= 10? 1123*481dde66SAndroid Build Coastguard Workerconst int count = count_if(v.begin(), v.end(), Matches(Ge(10))); 1124*481dde66SAndroid Build Coastguard Worker``` 1125*481dde66SAndroid Build Coastguard Worker 1126*481dde66SAndroid Build Coastguard WorkerSince you can build complex matchers from simpler ones easily using gMock, this 1127*481dde66SAndroid Build Coastguard Workergives you a way to conveniently construct composite predicates (doing the same 1128*481dde66SAndroid Build Coastguard Workerusing STL's `<functional>` header is just painful). For example, here's a 1129*481dde66SAndroid Build Coastguard Workerpredicate that's satisfied by any number that is >= 0, <= 100, and != 50: 1130*481dde66SAndroid Build Coastguard Worker 1131*481dde66SAndroid Build Coastguard Worker```cpp 1132*481dde66SAndroid Build Coastguard Workerusing ::testing::AllOf; 1133*481dde66SAndroid Build Coastguard Workerusing ::testing::Ge; 1134*481dde66SAndroid Build Coastguard Workerusing ::testing::Le; 1135*481dde66SAndroid Build Coastguard Workerusing ::testing::Matches; 1136*481dde66SAndroid Build Coastguard Workerusing ::testing::Ne; 1137*481dde66SAndroid Build Coastguard Worker... 1138*481dde66SAndroid Build Coastguard WorkerMatches(AllOf(Ge(0), Le(100), Ne(50))) 1139*481dde66SAndroid Build Coastguard Worker``` 1140*481dde66SAndroid Build Coastguard Worker 1141*481dde66SAndroid Build Coastguard Worker### Using Matchers in googletest Assertions 1142*481dde66SAndroid Build Coastguard Worker 1143*481dde66SAndroid Build Coastguard WorkerSee [`EXPECT_THAT`](reference/assertions.md#EXPECT_THAT) in the Assertions 1144*481dde66SAndroid Build Coastguard WorkerReference. 1145*481dde66SAndroid Build Coastguard Worker 1146*481dde66SAndroid Build Coastguard Worker### Using Predicates as Matchers 1147*481dde66SAndroid Build Coastguard Worker 1148*481dde66SAndroid Build Coastguard WorkergMock provides a set of built-in matchers for matching arguments with expected 1149*481dde66SAndroid Build Coastguard Workervalues—see the [Matchers Reference](reference/matchers.md) for more information. 1150*481dde66SAndroid Build Coastguard WorkerIn case you find the built-in set lacking, you can use an arbitrary unary 1151*481dde66SAndroid Build Coastguard Workerpredicate function or functor as a matcher - as long as the predicate accepts a 1152*481dde66SAndroid Build Coastguard Workervalue of the type you want. You do this by wrapping the predicate inside the 1153*481dde66SAndroid Build Coastguard Worker`Truly()` function, for example: 1154*481dde66SAndroid Build Coastguard Worker 1155*481dde66SAndroid Build Coastguard Worker```cpp 1156*481dde66SAndroid Build Coastguard Workerusing ::testing::Truly; 1157*481dde66SAndroid Build Coastguard Worker 1158*481dde66SAndroid Build Coastguard Workerint IsEven(int n) { return (n % 2) == 0 ? 1 : 0; } 1159*481dde66SAndroid Build Coastguard Worker... 1160*481dde66SAndroid Build Coastguard Worker // Bar() must be called with an even number. 1161*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(Truly(IsEven))); 1162*481dde66SAndroid Build Coastguard Worker``` 1163*481dde66SAndroid Build Coastguard Worker 1164*481dde66SAndroid Build Coastguard WorkerNote that the predicate function / functor doesn't have to return `bool`. It 1165*481dde66SAndroid Build Coastguard Workerworks as long as the return value can be used as the condition in the statement 1166*481dde66SAndroid Build Coastguard Worker`if (condition) ...`. 1167*481dde66SAndroid Build Coastguard Worker 1168*481dde66SAndroid Build Coastguard Worker### Matching Arguments that Are Not Copyable 1169*481dde66SAndroid Build Coastguard Worker 1170*481dde66SAndroid Build Coastguard WorkerWhen you do an `EXPECT_CALL(mock_obj, Foo(bar))`, gMock saves away a copy of 1171*481dde66SAndroid Build Coastguard Worker`bar`. When `Foo()` is called later, gMock compares the argument to `Foo()` with 1172*481dde66SAndroid Build Coastguard Workerthe saved copy of `bar`. This way, you don't need to worry about `bar` being 1173*481dde66SAndroid Build Coastguard Workermodified or destroyed after the `EXPECT_CALL()` is executed. The same is true 1174*481dde66SAndroid Build Coastguard Workerwhen you use matchers like `Eq(bar)`, `Le(bar)`, and so on. 1175*481dde66SAndroid Build Coastguard Worker 1176*481dde66SAndroid Build Coastguard WorkerBut what if `bar` cannot be copied (i.e. has no copy constructor)? You could 1177*481dde66SAndroid Build Coastguard Workerdefine your own matcher function or callback and use it with `Truly()`, as the 1178*481dde66SAndroid Build Coastguard Workerprevious couple of recipes have shown. Or, you may be able to get away from it 1179*481dde66SAndroid Build Coastguard Workerif you can guarantee that `bar` won't be changed after the `EXPECT_CALL()` is 1180*481dde66SAndroid Build Coastguard Workerexecuted. Just tell gMock that it should save a reference to `bar`, instead of a 1181*481dde66SAndroid Build Coastguard Workercopy of it. Here's how: 1182*481dde66SAndroid Build Coastguard Worker 1183*481dde66SAndroid Build Coastguard Worker```cpp 1184*481dde66SAndroid Build Coastguard Workerusing ::testing::Eq; 1185*481dde66SAndroid Build Coastguard Workerusing ::testing::Lt; 1186*481dde66SAndroid Build Coastguard Worker... 1187*481dde66SAndroid Build Coastguard Worker // Expects that Foo()'s argument == bar. 1188*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_obj, Foo(Eq(std::ref(bar)))); 1189*481dde66SAndroid Build Coastguard Worker 1190*481dde66SAndroid Build Coastguard Worker // Expects that Foo()'s argument < bar. 1191*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_obj, Foo(Lt(std::ref(bar)))); 1192*481dde66SAndroid Build Coastguard Worker``` 1193*481dde66SAndroid Build Coastguard Worker 1194*481dde66SAndroid Build Coastguard WorkerRemember: if you do this, don't change `bar` after the `EXPECT_CALL()`, or the 1195*481dde66SAndroid Build Coastguard Workerresult is undefined. 1196*481dde66SAndroid Build Coastguard Worker 1197*481dde66SAndroid Build Coastguard Worker### Validating a Member of an Object 1198*481dde66SAndroid Build Coastguard Worker 1199*481dde66SAndroid Build Coastguard WorkerOften a mock function takes a reference to object as an argument. When matching 1200*481dde66SAndroid Build Coastguard Workerthe argument, you may not want to compare the entire object against a fixed 1201*481dde66SAndroid Build Coastguard Workerobject, as that may be over-specification. Instead, you may need to validate a 1202*481dde66SAndroid Build Coastguard Workercertain member variable or the result of a certain getter method of the object. 1203*481dde66SAndroid Build Coastguard WorkerYou can do this with `Field()` and `Property()`. More specifically, 1204*481dde66SAndroid Build Coastguard Worker 1205*481dde66SAndroid Build Coastguard Worker```cpp 1206*481dde66SAndroid Build Coastguard WorkerField(&Foo::bar, m) 1207*481dde66SAndroid Build Coastguard Worker``` 1208*481dde66SAndroid Build Coastguard Worker 1209*481dde66SAndroid Build Coastguard Workeris a matcher that matches a `Foo` object whose `bar` member variable satisfies 1210*481dde66SAndroid Build Coastguard Workermatcher `m`. 1211*481dde66SAndroid Build Coastguard Worker 1212*481dde66SAndroid Build Coastguard Worker```cpp 1213*481dde66SAndroid Build Coastguard WorkerProperty(&Foo::baz, m) 1214*481dde66SAndroid Build Coastguard Worker``` 1215*481dde66SAndroid Build Coastguard Worker 1216*481dde66SAndroid Build Coastguard Workeris a matcher that matches a `Foo` object whose `baz()` method returns a value 1217*481dde66SAndroid Build Coastguard Workerthat satisfies matcher `m`. 1218*481dde66SAndroid Build Coastguard Worker 1219*481dde66SAndroid Build Coastguard WorkerFor example: 1220*481dde66SAndroid Build Coastguard Worker 1221*481dde66SAndroid Build Coastguard Worker| Expression | Description | 1222*481dde66SAndroid Build Coastguard Worker| :--------------------------- | :--------------------------------------- | 1223*481dde66SAndroid Build Coastguard Worker| `Field(&Foo::number, Ge(3))` | Matches `x` where `x.number >= 3`. | 1224*481dde66SAndroid Build Coastguard Worker| `Property(&Foo::name, StartsWith("John "))` | Matches `x` where `x.name()` starts with `"John "`. | 1225*481dde66SAndroid Build Coastguard Worker 1226*481dde66SAndroid Build Coastguard WorkerNote that in `Property(&Foo::baz, ...)`, method `baz()` must take no argument 1227*481dde66SAndroid Build Coastguard Workerand be declared as `const`. Don't use `Property()` against member functions that 1228*481dde66SAndroid Build Coastguard Workeryou do not own, because taking addresses of functions is fragile and generally 1229*481dde66SAndroid Build Coastguard Workernot part of the contract of the function. 1230*481dde66SAndroid Build Coastguard Worker 1231*481dde66SAndroid Build Coastguard Worker`Field()` and `Property()` can also match plain pointers to objects. For 1232*481dde66SAndroid Build Coastguard Workerinstance, 1233*481dde66SAndroid Build Coastguard Worker 1234*481dde66SAndroid Build Coastguard Worker```cpp 1235*481dde66SAndroid Build Coastguard Workerusing ::testing::Field; 1236*481dde66SAndroid Build Coastguard Workerusing ::testing::Ge; 1237*481dde66SAndroid Build Coastguard Worker... 1238*481dde66SAndroid Build Coastguard WorkerField(&Foo::number, Ge(3)) 1239*481dde66SAndroid Build Coastguard Worker``` 1240*481dde66SAndroid Build Coastguard Worker 1241*481dde66SAndroid Build Coastguard Workermatches a plain pointer `p` where `p->number >= 3`. If `p` is `NULL`, the match 1242*481dde66SAndroid Build Coastguard Workerwill always fail regardless of the inner matcher. 1243*481dde66SAndroid Build Coastguard Worker 1244*481dde66SAndroid Build Coastguard WorkerWhat if you want to validate more than one members at the same time? Remember 1245*481dde66SAndroid Build Coastguard Workerthat there are [`AllOf()` and `AllOfArray()`](#CombiningMatchers). 1246*481dde66SAndroid Build Coastguard Worker 1247*481dde66SAndroid Build Coastguard WorkerFinally `Field()` and `Property()` provide overloads that take the field or 1248*481dde66SAndroid Build Coastguard Workerproperty names as the first argument to include it in the error message. This 1249*481dde66SAndroid Build Coastguard Workercan be useful when creating combined matchers. 1250*481dde66SAndroid Build Coastguard Worker 1251*481dde66SAndroid Build Coastguard Worker```cpp 1252*481dde66SAndroid Build Coastguard Workerusing ::testing::AllOf; 1253*481dde66SAndroid Build Coastguard Workerusing ::testing::Field; 1254*481dde66SAndroid Build Coastguard Workerusing ::testing::Matcher; 1255*481dde66SAndroid Build Coastguard Workerusing ::testing::SafeMatcherCast; 1256*481dde66SAndroid Build Coastguard Worker 1257*481dde66SAndroid Build Coastguard WorkerMatcher<Foo> IsFoo(const Foo& foo) { 1258*481dde66SAndroid Build Coastguard Worker return AllOf(Field("some_field", &Foo::some_field, foo.some_field), 1259*481dde66SAndroid Build Coastguard Worker Field("other_field", &Foo::other_field, foo.other_field), 1260*481dde66SAndroid Build Coastguard Worker Field("last_field", &Foo::last_field, foo.last_field)); 1261*481dde66SAndroid Build Coastguard Worker} 1262*481dde66SAndroid Build Coastguard Worker``` 1263*481dde66SAndroid Build Coastguard Worker 1264*481dde66SAndroid Build Coastguard Worker### Validating the Value Pointed to by a Pointer Argument 1265*481dde66SAndroid Build Coastguard Worker 1266*481dde66SAndroid Build Coastguard WorkerC++ functions often take pointers as arguments. You can use matchers like 1267*481dde66SAndroid Build Coastguard Worker`IsNull()`, `NotNull()`, and other comparison matchers to match a pointer, but 1268*481dde66SAndroid Build Coastguard Workerwhat if you want to make sure the value *pointed to* by the pointer, instead of 1269*481dde66SAndroid Build Coastguard Workerthe pointer itself, has a certain property? Well, you can use the `Pointee(m)` 1270*481dde66SAndroid Build Coastguard Workermatcher. 1271*481dde66SAndroid Build Coastguard Worker 1272*481dde66SAndroid Build Coastguard Worker`Pointee(m)` matches a pointer if and only if `m` matches the value the pointer 1273*481dde66SAndroid Build Coastguard Workerpoints to. For example: 1274*481dde66SAndroid Build Coastguard Worker 1275*481dde66SAndroid Build Coastguard Worker```cpp 1276*481dde66SAndroid Build Coastguard Workerusing ::testing::Ge; 1277*481dde66SAndroid Build Coastguard Workerusing ::testing::Pointee; 1278*481dde66SAndroid Build Coastguard Worker... 1279*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(Pointee(Ge(3)))); 1280*481dde66SAndroid Build Coastguard Worker``` 1281*481dde66SAndroid Build Coastguard Worker 1282*481dde66SAndroid Build Coastguard Workerexpects `foo.Bar()` to be called with a pointer that points to a value greater 1283*481dde66SAndroid Build Coastguard Workerthan or equal to 3. 1284*481dde66SAndroid Build Coastguard Worker 1285*481dde66SAndroid Build Coastguard WorkerOne nice thing about `Pointee()` is that it treats a `NULL` pointer as a match 1286*481dde66SAndroid Build Coastguard Workerfailure, so you can write `Pointee(m)` instead of 1287*481dde66SAndroid Build Coastguard Worker 1288*481dde66SAndroid Build Coastguard Worker```cpp 1289*481dde66SAndroid Build Coastguard Workerusing ::testing::AllOf; 1290*481dde66SAndroid Build Coastguard Workerusing ::testing::NotNull; 1291*481dde66SAndroid Build Coastguard Workerusing ::testing::Pointee; 1292*481dde66SAndroid Build Coastguard Worker... 1293*481dde66SAndroid Build Coastguard Worker AllOf(NotNull(), Pointee(m)) 1294*481dde66SAndroid Build Coastguard Worker``` 1295*481dde66SAndroid Build Coastguard Worker 1296*481dde66SAndroid Build Coastguard Workerwithout worrying that a `NULL` pointer will crash your test. 1297*481dde66SAndroid Build Coastguard Worker 1298*481dde66SAndroid Build Coastguard WorkerAlso, did we tell you that `Pointee()` works with both raw pointers **and** 1299*481dde66SAndroid Build Coastguard Workersmart pointers (`std::unique_ptr`, `std::shared_ptr`, etc)? 1300*481dde66SAndroid Build Coastguard Worker 1301*481dde66SAndroid Build Coastguard WorkerWhat if you have a pointer to pointer? You guessed it - you can use nested 1302*481dde66SAndroid Build Coastguard Worker`Pointee()` to probe deeper inside the value. For example, 1303*481dde66SAndroid Build Coastguard Worker`Pointee(Pointee(Lt(3)))` matches a pointer that points to a pointer that points 1304*481dde66SAndroid Build Coastguard Workerto a number less than 3 (what a mouthful...). 1305*481dde66SAndroid Build Coastguard Worker 1306*481dde66SAndroid Build Coastguard Worker### Defining a Custom Matcher Class {#CustomMatcherClass} 1307*481dde66SAndroid Build Coastguard Worker 1308*481dde66SAndroid Build Coastguard WorkerMost matchers can be simply defined using [the MATCHER* macros](#NewMatchers), 1309*481dde66SAndroid Build Coastguard Workerwhich are terse and flexible, and produce good error messages. However, these 1310*481dde66SAndroid Build Coastguard Workermacros are not very explicit about the interfaces they create and are not always 1311*481dde66SAndroid Build Coastguard Workersuitable, especially for matchers that will be widely reused. 1312*481dde66SAndroid Build Coastguard Worker 1313*481dde66SAndroid Build Coastguard WorkerFor more advanced cases, you may need to define your own matcher class. A custom 1314*481dde66SAndroid Build Coastguard Workermatcher allows you to test a specific invariant property of that object. Let's 1315*481dde66SAndroid Build Coastguard Workertake a look at how to do so. 1316*481dde66SAndroid Build Coastguard Worker 1317*481dde66SAndroid Build Coastguard WorkerImagine you have a mock function that takes an object of type `Foo`, which has 1318*481dde66SAndroid Build Coastguard Workeran `int bar()` method and an `int baz()` method. You want to constrain that the 1319*481dde66SAndroid Build Coastguard Workerargument's `bar()` value plus its `baz()` value is a given number. (This is an 1320*481dde66SAndroid Build Coastguard Workerinvariant.) Here's how we can write and use a matcher class to do so: 1321*481dde66SAndroid Build Coastguard Worker 1322*481dde66SAndroid Build Coastguard Worker```cpp 1323*481dde66SAndroid Build Coastguard Workerclass BarPlusBazEqMatcher { 1324*481dde66SAndroid Build Coastguard Worker public: 1325*481dde66SAndroid Build Coastguard Worker using is_gtest_matcher = void; 1326*481dde66SAndroid Build Coastguard Worker 1327*481dde66SAndroid Build Coastguard Worker explicit BarPlusBazEqMatcher(int expected_sum) 1328*481dde66SAndroid Build Coastguard Worker : expected_sum_(expected_sum) {} 1329*481dde66SAndroid Build Coastguard Worker 1330*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const Foo& foo, 1331*481dde66SAndroid Build Coastguard Worker std::ostream* /* listener */) const { 1332*481dde66SAndroid Build Coastguard Worker return (foo.bar() + foo.baz()) == expected_sum_; 1333*481dde66SAndroid Build Coastguard Worker } 1334*481dde66SAndroid Build Coastguard Worker 1335*481dde66SAndroid Build Coastguard Worker void DescribeTo(std::ostream* os) const { 1336*481dde66SAndroid Build Coastguard Worker *os << "bar() + baz() equals " << expected_sum_; 1337*481dde66SAndroid Build Coastguard Worker } 1338*481dde66SAndroid Build Coastguard Worker 1339*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(std::ostream* os) const { 1340*481dde66SAndroid Build Coastguard Worker *os << "bar() + baz() does not equal " << expected_sum_; 1341*481dde66SAndroid Build Coastguard Worker } 1342*481dde66SAndroid Build Coastguard Worker private: 1343*481dde66SAndroid Build Coastguard Worker const int expected_sum_; 1344*481dde66SAndroid Build Coastguard Worker}; 1345*481dde66SAndroid Build Coastguard Worker 1346*481dde66SAndroid Build Coastguard Worker::testing::Matcher<const Foo&> BarPlusBazEq(int expected_sum) { 1347*481dde66SAndroid Build Coastguard Worker return BarPlusBazEqMatcher(expected_sum); 1348*481dde66SAndroid Build Coastguard Worker} 1349*481dde66SAndroid Build Coastguard Worker 1350*481dde66SAndroid Build Coastguard Worker... 1351*481dde66SAndroid Build Coastguard Worker Foo foo; 1352*481dde66SAndroid Build Coastguard Worker EXPECT_THAT(foo, BarPlusBazEq(5))...; 1353*481dde66SAndroid Build Coastguard Worker``` 1354*481dde66SAndroid Build Coastguard Worker 1355*481dde66SAndroid Build Coastguard Worker### Matching Containers 1356*481dde66SAndroid Build Coastguard Worker 1357*481dde66SAndroid Build Coastguard WorkerSometimes an STL container (e.g. list, vector, map, ...) is passed to a mock 1358*481dde66SAndroid Build Coastguard Workerfunction and you may want to validate it. Since most STL containers support the 1359*481dde66SAndroid Build Coastguard Worker`==` operator, you can write `Eq(expected_container)` or simply 1360*481dde66SAndroid Build Coastguard Worker`expected_container` to match a container exactly. 1361*481dde66SAndroid Build Coastguard Worker 1362*481dde66SAndroid Build Coastguard WorkerSometimes, though, you may want to be more flexible (for example, the first 1363*481dde66SAndroid Build Coastguard Workerelement must be an exact match, but the second element can be any positive 1364*481dde66SAndroid Build Coastguard Workernumber, and so on). Also, containers used in tests often have a small number of 1365*481dde66SAndroid Build Coastguard Workerelements, and having to define the expected container out-of-line is a bit of a 1366*481dde66SAndroid Build Coastguard Workerhassle. 1367*481dde66SAndroid Build Coastguard Worker 1368*481dde66SAndroid Build Coastguard WorkerYou can use the `ElementsAre()` or `UnorderedElementsAre()` matcher in such 1369*481dde66SAndroid Build Coastguard Workercases: 1370*481dde66SAndroid Build Coastguard Worker 1371*481dde66SAndroid Build Coastguard Worker```cpp 1372*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1373*481dde66SAndroid Build Coastguard Workerusing ::testing::ElementsAre; 1374*481dde66SAndroid Build Coastguard Workerusing ::testing::Gt; 1375*481dde66SAndroid Build Coastguard Worker... 1376*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Foo, (const vector<int>& numbers), (override)); 1377*481dde66SAndroid Build Coastguard Worker... 1378*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo(ElementsAre(1, Gt(0), _, 5))); 1379*481dde66SAndroid Build Coastguard Worker``` 1380*481dde66SAndroid Build Coastguard Worker 1381*481dde66SAndroid Build Coastguard WorkerThe above matcher says that the container must have 4 elements, which must be 1, 1382*481dde66SAndroid Build Coastguard Workergreater than 0, anything, and 5 respectively. 1383*481dde66SAndroid Build Coastguard Worker 1384*481dde66SAndroid Build Coastguard WorkerIf you instead write: 1385*481dde66SAndroid Build Coastguard Worker 1386*481dde66SAndroid Build Coastguard Worker```cpp 1387*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1388*481dde66SAndroid Build Coastguard Workerusing ::testing::Gt; 1389*481dde66SAndroid Build Coastguard Workerusing ::testing::UnorderedElementsAre; 1390*481dde66SAndroid Build Coastguard Worker... 1391*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Foo, (const vector<int>& numbers), (override)); 1392*481dde66SAndroid Build Coastguard Worker... 1393*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo(UnorderedElementsAre(1, Gt(0), _, 5))); 1394*481dde66SAndroid Build Coastguard Worker``` 1395*481dde66SAndroid Build Coastguard Worker 1396*481dde66SAndroid Build Coastguard WorkerIt means that the container must have 4 elements, which (under some permutation) 1397*481dde66SAndroid Build Coastguard Workermust be 1, greater than 0, anything, and 5 respectively. 1398*481dde66SAndroid Build Coastguard Worker 1399*481dde66SAndroid Build Coastguard WorkerAs an alternative you can place the arguments in a C-style array and use 1400*481dde66SAndroid Build Coastguard Worker`ElementsAreArray()` or `UnorderedElementsAreArray()` instead: 1401*481dde66SAndroid Build Coastguard Worker 1402*481dde66SAndroid Build Coastguard Worker```cpp 1403*481dde66SAndroid Build Coastguard Workerusing ::testing::ElementsAreArray; 1404*481dde66SAndroid Build Coastguard Worker... 1405*481dde66SAndroid Build Coastguard Worker // ElementsAreArray accepts an array of element values. 1406*481dde66SAndroid Build Coastguard Worker const int expected_vector1[] = {1, 5, 2, 4, ...}; 1407*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector1))); 1408*481dde66SAndroid Build Coastguard Worker 1409*481dde66SAndroid Build Coastguard Worker // Or, an array of element matchers. 1410*481dde66SAndroid Build Coastguard Worker Matcher<int> expected_vector2[] = {1, Gt(2), _, 3, ...}; 1411*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector2))); 1412*481dde66SAndroid Build Coastguard Worker``` 1413*481dde66SAndroid Build Coastguard Worker 1414*481dde66SAndroid Build Coastguard WorkerIn case the array needs to be dynamically created (and therefore the array size 1415*481dde66SAndroid Build Coastguard Workercannot be inferred by the compiler), you can give `ElementsAreArray()` an 1416*481dde66SAndroid Build Coastguard Workeradditional argument to specify the array size: 1417*481dde66SAndroid Build Coastguard Worker 1418*481dde66SAndroid Build Coastguard Worker```cpp 1419*481dde66SAndroid Build Coastguard Workerusing ::testing::ElementsAreArray; 1420*481dde66SAndroid Build Coastguard Worker... 1421*481dde66SAndroid Build Coastguard Worker int* const expected_vector3 = new int[count]; 1422*481dde66SAndroid Build Coastguard Worker ... fill expected_vector3 with values ... 1423*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector3, count))); 1424*481dde66SAndroid Build Coastguard Worker``` 1425*481dde66SAndroid Build Coastguard Worker 1426*481dde66SAndroid Build Coastguard WorkerUse `Pair` when comparing maps or other associative containers. 1427*481dde66SAndroid Build Coastguard Worker 1428*481dde66SAndroid Build Coastguard Worker{% raw %} 1429*481dde66SAndroid Build Coastguard Worker 1430*481dde66SAndroid Build Coastguard Worker```cpp 1431*481dde66SAndroid Build Coastguard Workerusing ::testing::UnorderedElementsAre; 1432*481dde66SAndroid Build Coastguard Workerusing ::testing::Pair; 1433*481dde66SAndroid Build Coastguard Worker... 1434*481dde66SAndroid Build Coastguard Worker absl::flat_hash_map<string, int> m = {{"a", 1}, {"b", 2}, {"c", 3}}; 1435*481dde66SAndroid Build Coastguard Worker EXPECT_THAT(m, UnorderedElementsAre( 1436*481dde66SAndroid Build Coastguard Worker Pair("a", 1), Pair("b", 2), Pair("c", 3))); 1437*481dde66SAndroid Build Coastguard Worker``` 1438*481dde66SAndroid Build Coastguard Worker 1439*481dde66SAndroid Build Coastguard Worker{% endraw %} 1440*481dde66SAndroid Build Coastguard Worker 1441*481dde66SAndroid Build Coastguard Worker**Tips:** 1442*481dde66SAndroid Build Coastguard Worker 1443*481dde66SAndroid Build Coastguard Worker* `ElementsAre*()` can be used to match *any* container that implements the 1444*481dde66SAndroid Build Coastguard Worker STL iterator pattern (i.e. it has a `const_iterator` type and supports 1445*481dde66SAndroid Build Coastguard Worker `begin()/end()`), not just the ones defined in STL. It will even work with 1446*481dde66SAndroid Build Coastguard Worker container types yet to be written - as long as they follows the above 1447*481dde66SAndroid Build Coastguard Worker pattern. 1448*481dde66SAndroid Build Coastguard Worker* You can use nested `ElementsAre*()` to match nested (multi-dimensional) 1449*481dde66SAndroid Build Coastguard Worker containers. 1450*481dde66SAndroid Build Coastguard Worker* If the container is passed by pointer instead of by reference, just write 1451*481dde66SAndroid Build Coastguard Worker `Pointee(ElementsAre*(...))`. 1452*481dde66SAndroid Build Coastguard Worker* The order of elements *matters* for `ElementsAre*()`. If you are using it 1453*481dde66SAndroid Build Coastguard Worker with containers whose element order are undefined (such as a 1454*481dde66SAndroid Build Coastguard Worker `std::unordered_map`) you should use `UnorderedElementsAre`. 1455*481dde66SAndroid Build Coastguard Worker 1456*481dde66SAndroid Build Coastguard Worker### Sharing Matchers 1457*481dde66SAndroid Build Coastguard Worker 1458*481dde66SAndroid Build Coastguard WorkerUnder the hood, a gMock matcher object consists of a pointer to a ref-counted 1459*481dde66SAndroid Build Coastguard Workerimplementation object. Copying matchers is allowed and very efficient, as only 1460*481dde66SAndroid Build Coastguard Workerthe pointer is copied. When the last matcher that references the implementation 1461*481dde66SAndroid Build Coastguard Workerobject dies, the implementation object will be deleted. 1462*481dde66SAndroid Build Coastguard Worker 1463*481dde66SAndroid Build Coastguard WorkerTherefore, if you have some complex matcher that you want to use again and 1464*481dde66SAndroid Build Coastguard Workeragain, there is no need to build it every time. Just assign it to a matcher 1465*481dde66SAndroid Build Coastguard Workervariable and use that variable repeatedly! For example, 1466*481dde66SAndroid Build Coastguard Worker 1467*481dde66SAndroid Build Coastguard Worker```cpp 1468*481dde66SAndroid Build Coastguard Workerusing ::testing::AllOf; 1469*481dde66SAndroid Build Coastguard Workerusing ::testing::Gt; 1470*481dde66SAndroid Build Coastguard Workerusing ::testing::Le; 1471*481dde66SAndroid Build Coastguard Workerusing ::testing::Matcher; 1472*481dde66SAndroid Build Coastguard Worker... 1473*481dde66SAndroid Build Coastguard Worker Matcher<int> in_range = AllOf(Gt(5), Le(10)); 1474*481dde66SAndroid Build Coastguard Worker ... use in_range as a matcher in multiple EXPECT_CALLs ... 1475*481dde66SAndroid Build Coastguard Worker``` 1476*481dde66SAndroid Build Coastguard Worker 1477*481dde66SAndroid Build Coastguard Worker### Matchers must have no side-effects {#PureMatchers} 1478*481dde66SAndroid Build Coastguard Worker 1479*481dde66SAndroid Build Coastguard Worker{: .callout .warning} 1480*481dde66SAndroid Build Coastguard WorkerWARNING: gMock does not guarantee when or how many times a matcher will be 1481*481dde66SAndroid Build Coastguard Workerinvoked. Therefore, all matchers must be *purely functional*: they cannot have 1482*481dde66SAndroid Build Coastguard Workerany side effects, and the match result must not depend on anything other than 1483*481dde66SAndroid Build Coastguard Workerthe matcher's parameters and the value being matched. 1484*481dde66SAndroid Build Coastguard Worker 1485*481dde66SAndroid Build Coastguard WorkerThis requirement must be satisfied no matter how a matcher is defined (e.g., if 1486*481dde66SAndroid Build Coastguard Workerit is one of the standard matchers, or a custom matcher). In particular, a 1487*481dde66SAndroid Build Coastguard Workermatcher can never call a mock function, as that will affect the state of the 1488*481dde66SAndroid Build Coastguard Workermock object and gMock. 1489*481dde66SAndroid Build Coastguard Worker 1490*481dde66SAndroid Build Coastguard Worker## Setting Expectations 1491*481dde66SAndroid Build Coastguard Worker 1492*481dde66SAndroid Build Coastguard Worker### Knowing When to Expect {#UseOnCall} 1493*481dde66SAndroid Build Coastguard Worker 1494*481dde66SAndroid Build Coastguard Worker**`ON_CALL`** is likely the *single most under-utilized construct* in gMock. 1495*481dde66SAndroid Build Coastguard Worker 1496*481dde66SAndroid Build Coastguard WorkerThere are basically two constructs for defining the behavior of a mock object: 1497*481dde66SAndroid Build Coastguard Worker`ON_CALL` and `EXPECT_CALL`. The difference? `ON_CALL` defines what happens when 1498*481dde66SAndroid Build Coastguard Workera mock method is called, but <em>doesn't imply any expectation on the method 1499*481dde66SAndroid Build Coastguard Workerbeing called</em>. `EXPECT_CALL` not only defines the behavior, but also sets an 1500*481dde66SAndroid Build Coastguard Workerexpectation that <em>the method will be called with the given arguments, for the 1501*481dde66SAndroid Build Coastguard Workergiven number of times</em> (and *in the given order* when you specify the order 1502*481dde66SAndroid Build Coastguard Workertoo). 1503*481dde66SAndroid Build Coastguard Worker 1504*481dde66SAndroid Build Coastguard WorkerSince `EXPECT_CALL` does more, isn't it better than `ON_CALL`? Not really. Every 1505*481dde66SAndroid Build Coastguard Worker`EXPECT_CALL` adds a constraint on the behavior of the code under test. Having 1506*481dde66SAndroid Build Coastguard Workermore constraints than necessary is *baaad* - even worse than not having enough 1507*481dde66SAndroid Build Coastguard Workerconstraints. 1508*481dde66SAndroid Build Coastguard Worker 1509*481dde66SAndroid Build Coastguard WorkerThis may be counter-intuitive. How could tests that verify more be worse than 1510*481dde66SAndroid Build Coastguard Workertests that verify less? Isn't verification the whole point of tests? 1511*481dde66SAndroid Build Coastguard Worker 1512*481dde66SAndroid Build Coastguard WorkerThe answer lies in *what* a test should verify. **A good test verifies the 1513*481dde66SAndroid Build Coastguard Workercontract of the code.** If a test over-specifies, it doesn't leave enough 1514*481dde66SAndroid Build Coastguard Workerfreedom to the implementation. As a result, changing the implementation without 1515*481dde66SAndroid Build Coastguard Workerbreaking the contract (e.g. refactoring and optimization), which should be 1516*481dde66SAndroid Build Coastguard Workerperfectly fine to do, can break such tests. Then you have to spend time fixing 1517*481dde66SAndroid Build Coastguard Workerthem, only to see them broken again the next time the implementation is changed. 1518*481dde66SAndroid Build Coastguard Worker 1519*481dde66SAndroid Build Coastguard WorkerKeep in mind that one doesn't have to verify more than one property in one test. 1520*481dde66SAndroid Build Coastguard WorkerIn fact, **it's a good style to verify only one thing in one test.** If you do 1521*481dde66SAndroid Build Coastguard Workerthat, a bug will likely break only one or two tests instead of dozens (which 1522*481dde66SAndroid Build Coastguard Workercase would you rather debug?). If you are also in the habit of giving tests 1523*481dde66SAndroid Build Coastguard Workerdescriptive names that tell what they verify, you can often easily guess what's 1524*481dde66SAndroid Build Coastguard Workerwrong just from the test log itself. 1525*481dde66SAndroid Build Coastguard Worker 1526*481dde66SAndroid Build Coastguard WorkerSo use `ON_CALL` by default, and only use `EXPECT_CALL` when you actually intend 1527*481dde66SAndroid Build Coastguard Workerto verify that the call is made. For example, you may have a bunch of `ON_CALL`s 1528*481dde66SAndroid Build Coastguard Workerin your test fixture to set the common mock behavior shared by all tests in the 1529*481dde66SAndroid Build Coastguard Workersame group, and write (scarcely) different `EXPECT_CALL`s in different `TEST_F`s 1530*481dde66SAndroid Build Coastguard Workerto verify different aspects of the code's behavior. Compared with the style 1531*481dde66SAndroid Build Coastguard Workerwhere each `TEST` has many `EXPECT_CALL`s, this leads to tests that are more 1532*481dde66SAndroid Build Coastguard Workerresilient to implementational changes (and thus less likely to require 1533*481dde66SAndroid Build Coastguard Workermaintenance) and makes the intent of the tests more obvious (so they are easier 1534*481dde66SAndroid Build Coastguard Workerto maintain when you do need to maintain them). 1535*481dde66SAndroid Build Coastguard Worker 1536*481dde66SAndroid Build Coastguard WorkerIf you are bothered by the "Uninteresting mock function call" message printed 1537*481dde66SAndroid Build Coastguard Workerwhen a mock method without an `EXPECT_CALL` is called, you may use a `NiceMock` 1538*481dde66SAndroid Build Coastguard Workerinstead to suppress all such messages for the mock object, or suppress the 1539*481dde66SAndroid Build Coastguard Workermessage for specific methods by adding `EXPECT_CALL(...).Times(AnyNumber())`. DO 1540*481dde66SAndroid Build Coastguard WorkerNOT suppress it by blindly adding an `EXPECT_CALL(...)`, or you'll have a test 1541*481dde66SAndroid Build Coastguard Workerthat's a pain to maintain. 1542*481dde66SAndroid Build Coastguard Worker 1543*481dde66SAndroid Build Coastguard Worker### Ignoring Uninteresting Calls 1544*481dde66SAndroid Build Coastguard Worker 1545*481dde66SAndroid Build Coastguard WorkerIf you are not interested in how a mock method is called, just don't say 1546*481dde66SAndroid Build Coastguard Workeranything about it. In this case, if the method is ever called, gMock will 1547*481dde66SAndroid Build Coastguard Workerperform its default action to allow the test program to continue. If you are not 1548*481dde66SAndroid Build Coastguard Workerhappy with the default action taken by gMock, you can override it using 1549*481dde66SAndroid Build Coastguard Worker`DefaultValue<T>::Set()` (described [here](#DefaultValue)) or `ON_CALL()`. 1550*481dde66SAndroid Build Coastguard Worker 1551*481dde66SAndroid Build Coastguard WorkerPlease note that once you expressed interest in a particular mock method (via 1552*481dde66SAndroid Build Coastguard Worker`EXPECT_CALL()`), all invocations to it must match some expectation. If this 1553*481dde66SAndroid Build Coastguard Workerfunction is called but the arguments don't match any `EXPECT_CALL()` statement, 1554*481dde66SAndroid Build Coastguard Workerit will be an error. 1555*481dde66SAndroid Build Coastguard Worker 1556*481dde66SAndroid Build Coastguard Worker### Disallowing Unexpected Calls 1557*481dde66SAndroid Build Coastguard Worker 1558*481dde66SAndroid Build Coastguard WorkerIf a mock method shouldn't be called at all, explicitly say so: 1559*481dde66SAndroid Build Coastguard Worker 1560*481dde66SAndroid Build Coastguard Worker```cpp 1561*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1562*481dde66SAndroid Build Coastguard Worker... 1563*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(_)) 1564*481dde66SAndroid Build Coastguard Worker .Times(0); 1565*481dde66SAndroid Build Coastguard Worker``` 1566*481dde66SAndroid Build Coastguard Worker 1567*481dde66SAndroid Build Coastguard WorkerIf some calls to the method are allowed, but the rest are not, just list all the 1568*481dde66SAndroid Build Coastguard Workerexpected calls: 1569*481dde66SAndroid Build Coastguard Worker 1570*481dde66SAndroid Build Coastguard Worker```cpp 1571*481dde66SAndroid Build Coastguard Workerusing ::testing::AnyNumber; 1572*481dde66SAndroid Build Coastguard Workerusing ::testing::Gt; 1573*481dde66SAndroid Build Coastguard Worker... 1574*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(5)); 1575*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(Gt(10))) 1576*481dde66SAndroid Build Coastguard Worker .Times(AnyNumber()); 1577*481dde66SAndroid Build Coastguard Worker``` 1578*481dde66SAndroid Build Coastguard Worker 1579*481dde66SAndroid Build Coastguard WorkerA call to `foo.Bar()` that doesn't match any of the `EXPECT_CALL()` statements 1580*481dde66SAndroid Build Coastguard Workerwill be an error. 1581*481dde66SAndroid Build Coastguard Worker 1582*481dde66SAndroid Build Coastguard Worker### Understanding Uninteresting vs Unexpected Calls {#uninteresting-vs-unexpected} 1583*481dde66SAndroid Build Coastguard Worker 1584*481dde66SAndroid Build Coastguard Worker*Uninteresting* calls and *unexpected* calls are different concepts in gMock. 1585*481dde66SAndroid Build Coastguard Worker*Very* different. 1586*481dde66SAndroid Build Coastguard Worker 1587*481dde66SAndroid Build Coastguard WorkerA call `x.Y(...)` is **uninteresting** if there's *not even a single* 1588*481dde66SAndroid Build Coastguard Worker`EXPECT_CALL(x, Y(...))` set. In other words, the test isn't interested in the 1589*481dde66SAndroid Build Coastguard Worker`x.Y()` method at all, as evident in that the test doesn't care to say anything 1590*481dde66SAndroid Build Coastguard Workerabout it. 1591*481dde66SAndroid Build Coastguard Worker 1592*481dde66SAndroid Build Coastguard WorkerA call `x.Y(...)` is **unexpected** if there are *some* `EXPECT_CALL(x, 1593*481dde66SAndroid Build Coastguard WorkerY(...))`s set, but none of them matches the call. Put another way, the test is 1594*481dde66SAndroid Build Coastguard Workerinterested in the `x.Y()` method (therefore it explicitly sets some 1595*481dde66SAndroid Build Coastguard Worker`EXPECT_CALL` to verify how it's called); however, the verification fails as the 1596*481dde66SAndroid Build Coastguard Workertest doesn't expect this particular call to happen. 1597*481dde66SAndroid Build Coastguard Worker 1598*481dde66SAndroid Build Coastguard Worker**An unexpected call is always an error,** as the code under test doesn't behave 1599*481dde66SAndroid Build Coastguard Workerthe way the test expects it to behave. 1600*481dde66SAndroid Build Coastguard Worker 1601*481dde66SAndroid Build Coastguard Worker**By default, an uninteresting call is not an error,** as it violates no 1602*481dde66SAndroid Build Coastguard Workerconstraint specified by the test. (gMock's philosophy is that saying nothing 1603*481dde66SAndroid Build Coastguard Workermeans there is no constraint.) However, it leads to a warning, as it *might* 1604*481dde66SAndroid Build Coastguard Workerindicate a problem (e.g. the test author might have forgotten to specify a 1605*481dde66SAndroid Build Coastguard Workerconstraint). 1606*481dde66SAndroid Build Coastguard Worker 1607*481dde66SAndroid Build Coastguard WorkerIn gMock, `NiceMock` and `StrictMock` can be used to make a mock class "nice" or 1608*481dde66SAndroid Build Coastguard Worker"strict". How does this affect uninteresting calls and unexpected calls? 1609*481dde66SAndroid Build Coastguard Worker 1610*481dde66SAndroid Build Coastguard WorkerA **nice mock** suppresses uninteresting call *warnings*. It is less chatty than 1611*481dde66SAndroid Build Coastguard Workerthe default mock, but otherwise is the same. If a test fails with a default 1612*481dde66SAndroid Build Coastguard Workermock, it will also fail using a nice mock instead. And vice versa. Don't expect 1613*481dde66SAndroid Build Coastguard Workermaking a mock nice to change the test's result. 1614*481dde66SAndroid Build Coastguard Worker 1615*481dde66SAndroid Build Coastguard WorkerA **strict mock** turns uninteresting call warnings into errors. So making a 1616*481dde66SAndroid Build Coastguard Workermock strict may change the test's result. 1617*481dde66SAndroid Build Coastguard Worker 1618*481dde66SAndroid Build Coastguard WorkerLet's look at an example: 1619*481dde66SAndroid Build Coastguard Worker 1620*481dde66SAndroid Build Coastguard Worker```cpp 1621*481dde66SAndroid Build Coastguard WorkerTEST(...) { 1622*481dde66SAndroid Build Coastguard Worker NiceMock<MockDomainRegistry> mock_registry; 1623*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) 1624*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(Return("Larry Page")); 1625*481dde66SAndroid Build Coastguard Worker 1626*481dde66SAndroid Build Coastguard Worker // Use mock_registry in code under test. 1627*481dde66SAndroid Build Coastguard Worker ... &mock_registry ... 1628*481dde66SAndroid Build Coastguard Worker} 1629*481dde66SAndroid Build Coastguard Worker``` 1630*481dde66SAndroid Build Coastguard Worker 1631*481dde66SAndroid Build Coastguard WorkerThe sole `EXPECT_CALL` here says that all calls to `GetDomainOwner()` must have 1632*481dde66SAndroid Build Coastguard Worker`"google.com"` as the argument. If `GetDomainOwner("yahoo.com")` is called, it 1633*481dde66SAndroid Build Coastguard Workerwill be an unexpected call, and thus an error. *Having a nice mock doesn't 1634*481dde66SAndroid Build Coastguard Workerchange the severity of an unexpected call.* 1635*481dde66SAndroid Build Coastguard Worker 1636*481dde66SAndroid Build Coastguard WorkerSo how do we tell gMock that `GetDomainOwner()` can be called with some other 1637*481dde66SAndroid Build Coastguard Workerarguments as well? The standard technique is to add a "catch all" `EXPECT_CALL`: 1638*481dde66SAndroid Build Coastguard Worker 1639*481dde66SAndroid Build Coastguard Worker```cpp 1640*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_registry, GetDomainOwner(_)) 1641*481dde66SAndroid Build Coastguard Worker .Times(AnyNumber()); // catches all other calls to this method. 1642*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) 1643*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(Return("Larry Page")); 1644*481dde66SAndroid Build Coastguard Worker``` 1645*481dde66SAndroid Build Coastguard Worker 1646*481dde66SAndroid Build Coastguard WorkerRemember that `_` is the wildcard matcher that matches anything. With this, if 1647*481dde66SAndroid Build Coastguard Worker`GetDomainOwner("google.com")` is called, it will do what the second 1648*481dde66SAndroid Build Coastguard Worker`EXPECT_CALL` says; if it is called with a different argument, it will do what 1649*481dde66SAndroid Build Coastguard Workerthe first `EXPECT_CALL` says. 1650*481dde66SAndroid Build Coastguard Worker 1651*481dde66SAndroid Build Coastguard WorkerNote that the order of the two `EXPECT_CALL`s is important, as a newer 1652*481dde66SAndroid Build Coastguard Worker`EXPECT_CALL` takes precedence over an older one. 1653*481dde66SAndroid Build Coastguard Worker 1654*481dde66SAndroid Build Coastguard WorkerFor more on uninteresting calls, nice mocks, and strict mocks, read 1655*481dde66SAndroid Build Coastguard Worker["The Nice, the Strict, and the Naggy"](#NiceStrictNaggy). 1656*481dde66SAndroid Build Coastguard Worker 1657*481dde66SAndroid Build Coastguard Worker### Ignoring Uninteresting Arguments {#ParameterlessExpectations} 1658*481dde66SAndroid Build Coastguard Worker 1659*481dde66SAndroid Build Coastguard WorkerIf your test doesn't care about the parameters (it only cares about the number 1660*481dde66SAndroid Build Coastguard Workeror order of calls), you can often simply omit the parameter list: 1661*481dde66SAndroid Build Coastguard Worker 1662*481dde66SAndroid Build Coastguard Worker```cpp 1663*481dde66SAndroid Build Coastguard Worker // Expect foo.Bar( ... ) twice with any arguments. 1664*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar).Times(2); 1665*481dde66SAndroid Build Coastguard Worker 1666*481dde66SAndroid Build Coastguard Worker // Delegate to the given method whenever the factory is invoked. 1667*481dde66SAndroid Build Coastguard Worker ON_CALL(foo_factory, MakeFoo) 1668*481dde66SAndroid Build Coastguard Worker .WillByDefault(&BuildFooForTest); 1669*481dde66SAndroid Build Coastguard Worker``` 1670*481dde66SAndroid Build Coastguard Worker 1671*481dde66SAndroid Build Coastguard WorkerThis functionality is only available when a method is not overloaded; to prevent 1672*481dde66SAndroid Build Coastguard Workerunexpected behavior it is a compilation error to try to set an expectation on a 1673*481dde66SAndroid Build Coastguard Workermethod where the specific overload is ambiguous. You can work around this by 1674*481dde66SAndroid Build Coastguard Workersupplying a [simpler mock interface](#SimplerInterfaces) than the mocked class 1675*481dde66SAndroid Build Coastguard Workerprovides. 1676*481dde66SAndroid Build Coastguard Worker 1677*481dde66SAndroid Build Coastguard WorkerThis pattern is also useful when the arguments are interesting, but match logic 1678*481dde66SAndroid Build Coastguard Workeris substantially complex. You can leave the argument list unspecified and use 1679*481dde66SAndroid Build Coastguard WorkerSaveArg actions to [save the values for later verification](#SaveArgVerify). If 1680*481dde66SAndroid Build Coastguard Workeryou do that, you can easily differentiate calling the method the wrong number of 1681*481dde66SAndroid Build Coastguard Workertimes from calling it with the wrong arguments. 1682*481dde66SAndroid Build Coastguard Worker 1683*481dde66SAndroid Build Coastguard Worker### Expecting Ordered Calls {#OrderedCalls} 1684*481dde66SAndroid Build Coastguard Worker 1685*481dde66SAndroid Build Coastguard WorkerAlthough an `EXPECT_CALL()` statement defined later takes precedence when gMock 1686*481dde66SAndroid Build Coastguard Workertries to match a function call with an expectation, by default calls don't have 1687*481dde66SAndroid Build Coastguard Workerto happen in the order `EXPECT_CALL()` statements are written. For example, if 1688*481dde66SAndroid Build Coastguard Workerthe arguments match the matchers in the second `EXPECT_CALL()`, but not those in 1689*481dde66SAndroid Build Coastguard Workerthe first and third, then the second expectation will be used. 1690*481dde66SAndroid Build Coastguard Worker 1691*481dde66SAndroid Build Coastguard WorkerIf you would rather have all calls occur in the order of the expectations, put 1692*481dde66SAndroid Build Coastguard Workerthe `EXPECT_CALL()` statements in a block where you define a variable of type 1693*481dde66SAndroid Build Coastguard Worker`InSequence`: 1694*481dde66SAndroid Build Coastguard Worker 1695*481dde66SAndroid Build Coastguard Worker```cpp 1696*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1697*481dde66SAndroid Build Coastguard Workerusing ::testing::InSequence; 1698*481dde66SAndroid Build Coastguard Worker 1699*481dde66SAndroid Build Coastguard Worker { 1700*481dde66SAndroid Build Coastguard Worker InSequence s; 1701*481dde66SAndroid Build Coastguard Worker 1702*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(5)); 1703*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(bar, DoThat(_)) 1704*481dde66SAndroid Build Coastguard Worker .Times(2); 1705*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(6)); 1706*481dde66SAndroid Build Coastguard Worker } 1707*481dde66SAndroid Build Coastguard Worker``` 1708*481dde66SAndroid Build Coastguard Worker 1709*481dde66SAndroid Build Coastguard WorkerIn this example, we expect a call to `foo.DoThis(5)`, followed by two calls to 1710*481dde66SAndroid Build Coastguard Worker`bar.DoThat()` where the argument can be anything, which are in turn followed by 1711*481dde66SAndroid Build Coastguard Workera call to `foo.DoThis(6)`. If a call occurred out-of-order, gMock will report an 1712*481dde66SAndroid Build Coastguard Workererror. 1713*481dde66SAndroid Build Coastguard Worker 1714*481dde66SAndroid Build Coastguard Worker### Expecting Partially Ordered Calls {#PartialOrder} 1715*481dde66SAndroid Build Coastguard Worker 1716*481dde66SAndroid Build Coastguard WorkerSometimes requiring everything to occur in a predetermined order can lead to 1717*481dde66SAndroid Build Coastguard Workerbrittle tests. For example, we may care about `A` occurring before both `B` and 1718*481dde66SAndroid Build Coastguard Worker`C`, but aren't interested in the relative order of `B` and `C`. In this case, 1719*481dde66SAndroid Build Coastguard Workerthe test should reflect our real intent, instead of being overly constraining. 1720*481dde66SAndroid Build Coastguard Worker 1721*481dde66SAndroid Build Coastguard WorkergMock allows you to impose an arbitrary DAG (directed acyclic graph) on the 1722*481dde66SAndroid Build Coastguard Workercalls. One way to express the DAG is to use the 1723*481dde66SAndroid Build Coastguard Worker[`After` clause](reference/mocking.md#EXPECT_CALL.After) of `EXPECT_CALL`. 1724*481dde66SAndroid Build Coastguard Worker 1725*481dde66SAndroid Build Coastguard WorkerAnother way is via the `InSequence()` clause (not the same as the `InSequence` 1726*481dde66SAndroid Build Coastguard Workerclass), which we borrowed from jMock 2. It's less flexible than `After()`, but 1727*481dde66SAndroid Build Coastguard Workermore convenient when you have long chains of sequential calls, as it doesn't 1728*481dde66SAndroid Build Coastguard Workerrequire you to come up with different names for the expectations in the chains. 1729*481dde66SAndroid Build Coastguard WorkerHere's how it works: 1730*481dde66SAndroid Build Coastguard Worker 1731*481dde66SAndroid Build Coastguard WorkerIf we view `EXPECT_CALL()` statements as nodes in a graph, and add an edge from 1732*481dde66SAndroid Build Coastguard Workernode A to node B wherever A must occur before B, we can get a DAG. We use the 1733*481dde66SAndroid Build Coastguard Workerterm "sequence" to mean a directed path in this DAG. Now, if we decompose the 1734*481dde66SAndroid Build Coastguard WorkerDAG into sequences, we just need to know which sequences each `EXPECT_CALL()` 1735*481dde66SAndroid Build Coastguard Workerbelongs to in order to be able to reconstruct the original DAG. 1736*481dde66SAndroid Build Coastguard Worker 1737*481dde66SAndroid Build Coastguard WorkerSo, to specify the partial order on the expectations we need to do two things: 1738*481dde66SAndroid Build Coastguard Workerfirst to define some `Sequence` objects, and then for each `EXPECT_CALL()` say 1739*481dde66SAndroid Build Coastguard Workerwhich `Sequence` objects it is part of. 1740*481dde66SAndroid Build Coastguard Worker 1741*481dde66SAndroid Build Coastguard WorkerExpectations in the same sequence must occur in the order they are written. For 1742*481dde66SAndroid Build Coastguard Workerexample, 1743*481dde66SAndroid Build Coastguard Worker 1744*481dde66SAndroid Build Coastguard Worker```cpp 1745*481dde66SAndroid Build Coastguard Workerusing ::testing::Sequence; 1746*481dde66SAndroid Build Coastguard Worker... 1747*481dde66SAndroid Build Coastguard Worker Sequence s1, s2; 1748*481dde66SAndroid Build Coastguard Worker 1749*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, A()) 1750*481dde66SAndroid Build Coastguard Worker .InSequence(s1, s2); 1751*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(bar, B()) 1752*481dde66SAndroid Build Coastguard Worker .InSequence(s1); 1753*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(bar, C()) 1754*481dde66SAndroid Build Coastguard Worker .InSequence(s2); 1755*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, D()) 1756*481dde66SAndroid Build Coastguard Worker .InSequence(s2); 1757*481dde66SAndroid Build Coastguard Worker``` 1758*481dde66SAndroid Build Coastguard Worker 1759*481dde66SAndroid Build Coastguard Workerspecifies the following DAG (where `s1` is `A -> B`, and `s2` is `A -> C -> D`): 1760*481dde66SAndroid Build Coastguard Worker 1761*481dde66SAndroid Build Coastguard Worker```text 1762*481dde66SAndroid Build Coastguard Worker +---> B 1763*481dde66SAndroid Build Coastguard Worker | 1764*481dde66SAndroid Build Coastguard Worker A ---| 1765*481dde66SAndroid Build Coastguard Worker | 1766*481dde66SAndroid Build Coastguard Worker +---> C ---> D 1767*481dde66SAndroid Build Coastguard Worker``` 1768*481dde66SAndroid Build Coastguard Worker 1769*481dde66SAndroid Build Coastguard WorkerThis means that A must occur before B and C, and C must occur before D. There's 1770*481dde66SAndroid Build Coastguard Workerno restriction about the order other than these. 1771*481dde66SAndroid Build Coastguard Worker 1772*481dde66SAndroid Build Coastguard Worker### Controlling When an Expectation Retires 1773*481dde66SAndroid Build Coastguard Worker 1774*481dde66SAndroid Build Coastguard WorkerWhen a mock method is called, gMock only considers expectations that are still 1775*481dde66SAndroid Build Coastguard Workeractive. An expectation is active when created, and becomes inactive (aka 1776*481dde66SAndroid Build Coastguard Worker*retires*) when a call that has to occur later has occurred. For example, in 1777*481dde66SAndroid Build Coastguard Worker 1778*481dde66SAndroid Build Coastguard Worker```cpp 1779*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1780*481dde66SAndroid Build Coastguard Workerusing ::testing::Sequence; 1781*481dde66SAndroid Build Coastguard Worker... 1782*481dde66SAndroid Build Coastguard Worker Sequence s1, s2; 1783*481dde66SAndroid Build Coastguard Worker 1784*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(log, Log(WARNING, _, "File too large.")) // #1 1785*481dde66SAndroid Build Coastguard Worker .Times(AnyNumber()) 1786*481dde66SAndroid Build Coastguard Worker .InSequence(s1, s2); 1787*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(log, Log(WARNING, _, "Data set is empty.")) // #2 1788*481dde66SAndroid Build Coastguard Worker .InSequence(s1); 1789*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(log, Log(WARNING, _, "User not found.")) // #3 1790*481dde66SAndroid Build Coastguard Worker .InSequence(s2); 1791*481dde66SAndroid Build Coastguard Worker``` 1792*481dde66SAndroid Build Coastguard Worker 1793*481dde66SAndroid Build Coastguard Workeras soon as either #2 or #3 is matched, #1 will retire. If a warning `"File too 1794*481dde66SAndroid Build Coastguard Workerlarge."` is logged after this, it will be an error. 1795*481dde66SAndroid Build Coastguard Worker 1796*481dde66SAndroid Build Coastguard WorkerNote that an expectation doesn't retire automatically when it's saturated. For 1797*481dde66SAndroid Build Coastguard Workerexample, 1798*481dde66SAndroid Build Coastguard Worker 1799*481dde66SAndroid Build Coastguard Worker```cpp 1800*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1801*481dde66SAndroid Build Coastguard Worker... 1802*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(log, Log(WARNING, _, _)); // #1 1803*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(log, Log(WARNING, _, "File too large.")); // #2 1804*481dde66SAndroid Build Coastguard Worker``` 1805*481dde66SAndroid Build Coastguard Worker 1806*481dde66SAndroid Build Coastguard Workersays that there will be exactly one warning with the message `"File too 1807*481dde66SAndroid Build Coastguard Workerlarge."`. If the second warning contains this message too, #2 will match again 1808*481dde66SAndroid Build Coastguard Workerand result in an upper-bound-violated error. 1809*481dde66SAndroid Build Coastguard Worker 1810*481dde66SAndroid Build Coastguard WorkerIf this is not what you want, you can ask an expectation to retire as soon as it 1811*481dde66SAndroid Build Coastguard Workerbecomes saturated: 1812*481dde66SAndroid Build Coastguard Worker 1813*481dde66SAndroid Build Coastguard Worker```cpp 1814*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1815*481dde66SAndroid Build Coastguard Worker... 1816*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(log, Log(WARNING, _, _)); // #1 1817*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(log, Log(WARNING, _, "File too large.")) // #2 1818*481dde66SAndroid Build Coastguard Worker .RetiresOnSaturation(); 1819*481dde66SAndroid Build Coastguard Worker``` 1820*481dde66SAndroid Build Coastguard Worker 1821*481dde66SAndroid Build Coastguard WorkerHere #2 can be used only once, so if you have two warnings with the message 1822*481dde66SAndroid Build Coastguard Worker`"File too large."`, the first will match #2 and the second will match #1 - 1823*481dde66SAndroid Build Coastguard Workerthere will be no error. 1824*481dde66SAndroid Build Coastguard Worker 1825*481dde66SAndroid Build Coastguard Worker## Using Actions 1826*481dde66SAndroid Build Coastguard Worker 1827*481dde66SAndroid Build Coastguard Worker### Returning References from Mock Methods 1828*481dde66SAndroid Build Coastguard Worker 1829*481dde66SAndroid Build Coastguard WorkerIf a mock function's return type is a reference, you need to use `ReturnRef()` 1830*481dde66SAndroid Build Coastguard Workerinstead of `Return()` to return a result: 1831*481dde66SAndroid Build Coastguard Worker 1832*481dde66SAndroid Build Coastguard Worker```cpp 1833*481dde66SAndroid Build Coastguard Workerusing ::testing::ReturnRef; 1834*481dde66SAndroid Build Coastguard Worker 1835*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 1836*481dde66SAndroid Build Coastguard Worker public: 1837*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(Bar&, GetBar, (), (override)); 1838*481dde66SAndroid Build Coastguard Worker}; 1839*481dde66SAndroid Build Coastguard Worker... 1840*481dde66SAndroid Build Coastguard Worker MockFoo foo; 1841*481dde66SAndroid Build Coastguard Worker Bar bar; 1842*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, GetBar()) 1843*481dde66SAndroid Build Coastguard Worker .WillOnce(ReturnRef(bar)); 1844*481dde66SAndroid Build Coastguard Worker... 1845*481dde66SAndroid Build Coastguard Worker``` 1846*481dde66SAndroid Build Coastguard Worker 1847*481dde66SAndroid Build Coastguard Worker### Returning Live Values from Mock Methods 1848*481dde66SAndroid Build Coastguard Worker 1849*481dde66SAndroid Build Coastguard WorkerThe `Return(x)` action saves a copy of `x` when the action is created, and 1850*481dde66SAndroid Build Coastguard Workeralways returns the same value whenever it's executed. Sometimes you may want to 1851*481dde66SAndroid Build Coastguard Workerinstead return the *live* value of `x` (i.e. its value at the time when the 1852*481dde66SAndroid Build Coastguard Workeraction is *executed*.). Use either `ReturnRef()` or `ReturnPointee()` for this 1853*481dde66SAndroid Build Coastguard Workerpurpose. 1854*481dde66SAndroid Build Coastguard Worker 1855*481dde66SAndroid Build Coastguard WorkerIf the mock function's return type is a reference, you can do it using 1856*481dde66SAndroid Build Coastguard Worker`ReturnRef(x)`, as shown in the previous recipe ("Returning References from Mock 1857*481dde66SAndroid Build Coastguard WorkerMethods"). However, gMock doesn't let you use `ReturnRef()` in a mock function 1858*481dde66SAndroid Build Coastguard Workerwhose return type is not a reference, as doing that usually indicates a user 1859*481dde66SAndroid Build Coastguard Workererror. So, what shall you do? 1860*481dde66SAndroid Build Coastguard Worker 1861*481dde66SAndroid Build Coastguard WorkerThough you may be tempted, DO NOT use `std::ref()`: 1862*481dde66SAndroid Build Coastguard Worker 1863*481dde66SAndroid Build Coastguard Worker```cpp 1864*481dde66SAndroid Build Coastguard Workerusing ::testing::Return; 1865*481dde66SAndroid Build Coastguard Worker 1866*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 1867*481dde66SAndroid Build Coastguard Worker public: 1868*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(int, GetValue, (), (override)); 1869*481dde66SAndroid Build Coastguard Worker}; 1870*481dde66SAndroid Build Coastguard Worker... 1871*481dde66SAndroid Build Coastguard Worker int x = 0; 1872*481dde66SAndroid Build Coastguard Worker MockFoo foo; 1873*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, GetValue()) 1874*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(Return(std::ref(x))); // Wrong! 1875*481dde66SAndroid Build Coastguard Worker x = 42; 1876*481dde66SAndroid Build Coastguard Worker EXPECT_EQ(foo.GetValue(), 42); 1877*481dde66SAndroid Build Coastguard Worker``` 1878*481dde66SAndroid Build Coastguard Worker 1879*481dde66SAndroid Build Coastguard WorkerUnfortunately, it doesn't work here. The above code will fail with error: 1880*481dde66SAndroid Build Coastguard Worker 1881*481dde66SAndroid Build Coastguard Worker```text 1882*481dde66SAndroid Build Coastguard WorkerValue of: foo.GetValue() 1883*481dde66SAndroid Build Coastguard Worker Actual: 0 1884*481dde66SAndroid Build Coastguard WorkerExpected: 42 1885*481dde66SAndroid Build Coastguard Worker``` 1886*481dde66SAndroid Build Coastguard Worker 1887*481dde66SAndroid Build Coastguard WorkerThe reason is that `Return(*value*)` converts `value` to the actual return type 1888*481dde66SAndroid Build Coastguard Workerof the mock function at the time when the action is *created*, not when it is 1889*481dde66SAndroid Build Coastguard Worker*executed*. (This behavior was chosen for the action to be safe when `value` is 1890*481dde66SAndroid Build Coastguard Workera proxy object that references some temporary objects.) As a result, 1891*481dde66SAndroid Build Coastguard Worker`std::ref(x)` is converted to an `int` value (instead of a `const int&`) when 1892*481dde66SAndroid Build Coastguard Workerthe expectation is set, and `Return(std::ref(x))` will always return 0. 1893*481dde66SAndroid Build Coastguard Worker 1894*481dde66SAndroid Build Coastguard Worker`ReturnPointee(pointer)` was provided to solve this problem specifically. It 1895*481dde66SAndroid Build Coastguard Workerreturns the value pointed to by `pointer` at the time the action is *executed*: 1896*481dde66SAndroid Build Coastguard Worker 1897*481dde66SAndroid Build Coastguard Worker```cpp 1898*481dde66SAndroid Build Coastguard Workerusing ::testing::ReturnPointee; 1899*481dde66SAndroid Build Coastguard Worker... 1900*481dde66SAndroid Build Coastguard Worker int x = 0; 1901*481dde66SAndroid Build Coastguard Worker MockFoo foo; 1902*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, GetValue()) 1903*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(ReturnPointee(&x)); // Note the & here. 1904*481dde66SAndroid Build Coastguard Worker x = 42; 1905*481dde66SAndroid Build Coastguard Worker EXPECT_EQ(foo.GetValue(), 42); // This will succeed now. 1906*481dde66SAndroid Build Coastguard Worker``` 1907*481dde66SAndroid Build Coastguard Worker 1908*481dde66SAndroid Build Coastguard Worker### Combining Actions 1909*481dde66SAndroid Build Coastguard Worker 1910*481dde66SAndroid Build Coastguard WorkerWant to do more than one thing when a function is called? That's fine. `DoAll()` 1911*481dde66SAndroid Build Coastguard Workerallows you to do a sequence of actions every time. Only the return value of the 1912*481dde66SAndroid Build Coastguard Workerlast action in the sequence will be used. 1913*481dde66SAndroid Build Coastguard Worker 1914*481dde66SAndroid Build Coastguard Worker```cpp 1915*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1916*481dde66SAndroid Build Coastguard Workerusing ::testing::DoAll; 1917*481dde66SAndroid Build Coastguard Worker 1918*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 1919*481dde66SAndroid Build Coastguard Worker public: 1920*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, Bar, (int n), (override)); 1921*481dde66SAndroid Build Coastguard Worker}; 1922*481dde66SAndroid Build Coastguard Worker... 1923*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(_)) 1924*481dde66SAndroid Build Coastguard Worker .WillOnce(DoAll(action_1, 1925*481dde66SAndroid Build Coastguard Worker action_2, 1926*481dde66SAndroid Build Coastguard Worker ... 1927*481dde66SAndroid Build Coastguard Worker action_n)); 1928*481dde66SAndroid Build Coastguard Worker``` 1929*481dde66SAndroid Build Coastguard Worker 1930*481dde66SAndroid Build Coastguard WorkerThe return value of the last action **must** match the return type of the mocked 1931*481dde66SAndroid Build Coastguard Workermethod. In the example above, `action_n` could be `Return(true)`, or a lambda 1932*481dde66SAndroid Build Coastguard Workerthat returns a `bool`, but not `SaveArg`, which returns `void`. Otherwise the 1933*481dde66SAndroid Build Coastguard Workersignature of `DoAll` would not match the signature expected by `WillOnce`, which 1934*481dde66SAndroid Build Coastguard Workeris the signature of the mocked method, and it wouldn't compile. 1935*481dde66SAndroid Build Coastguard Worker 1936*481dde66SAndroid Build Coastguard Worker### Verifying Complex Arguments {#SaveArgVerify} 1937*481dde66SAndroid Build Coastguard Worker 1938*481dde66SAndroid Build Coastguard WorkerIf you want to verify that a method is called with a particular argument but the 1939*481dde66SAndroid Build Coastguard Workermatch criteria is complex, it can be difficult to distinguish between 1940*481dde66SAndroid Build Coastguard Workercardinality failures (calling the method the wrong number of times) and argument 1941*481dde66SAndroid Build Coastguard Workermatch failures. Similarly, if you are matching multiple parameters, it may not 1942*481dde66SAndroid Build Coastguard Workerbe easy to distinguishing which argument failed to match. For example: 1943*481dde66SAndroid Build Coastguard Worker 1944*481dde66SAndroid Build Coastguard Worker```cpp 1945*481dde66SAndroid Build Coastguard Worker // Not ideal: this could fail because of a problem with arg1 or arg2, or maybe 1946*481dde66SAndroid Build Coastguard Worker // just the method wasn't called. 1947*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, SendValues(_, ElementsAre(1, 4, 4, 7), EqualsProto( ... ))); 1948*481dde66SAndroid Build Coastguard Worker``` 1949*481dde66SAndroid Build Coastguard Worker 1950*481dde66SAndroid Build Coastguard WorkerYou can instead save the arguments and test them individually: 1951*481dde66SAndroid Build Coastguard Worker 1952*481dde66SAndroid Build Coastguard Worker```cpp 1953*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, SendValues) 1954*481dde66SAndroid Build Coastguard Worker .WillOnce(DoAll(SaveArg<1>(&actual_array), SaveArg<2>(&actual_proto))); 1955*481dde66SAndroid Build Coastguard Worker ... run the test 1956*481dde66SAndroid Build Coastguard Worker EXPECT_THAT(actual_array, ElementsAre(1, 4, 4, 7)); 1957*481dde66SAndroid Build Coastguard Worker EXPECT_THAT(actual_proto, EqualsProto( ... )); 1958*481dde66SAndroid Build Coastguard Worker``` 1959*481dde66SAndroid Build Coastguard Worker 1960*481dde66SAndroid Build Coastguard Worker### Mocking Side Effects {#MockingSideEffects} 1961*481dde66SAndroid Build Coastguard Worker 1962*481dde66SAndroid Build Coastguard WorkerSometimes a method exhibits its effect not via returning a value but via side 1963*481dde66SAndroid Build Coastguard Workereffects. For example, it may change some global state or modify an output 1964*481dde66SAndroid Build Coastguard Workerargument. To mock side effects, in general you can define your own action by 1965*481dde66SAndroid Build Coastguard Workerimplementing `::testing::ActionInterface`. 1966*481dde66SAndroid Build Coastguard Worker 1967*481dde66SAndroid Build Coastguard WorkerIf all you need to do is to change an output argument, the built-in 1968*481dde66SAndroid Build Coastguard Worker`SetArgPointee()` action is convenient: 1969*481dde66SAndroid Build Coastguard Worker 1970*481dde66SAndroid Build Coastguard Worker```cpp 1971*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1972*481dde66SAndroid Build Coastguard Workerusing ::testing::SetArgPointee; 1973*481dde66SAndroid Build Coastguard Worker 1974*481dde66SAndroid Build Coastguard Workerclass MockMutator : public Mutator { 1975*481dde66SAndroid Build Coastguard Worker public: 1976*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Mutate, (bool mutate, int* value), (override)); 1977*481dde66SAndroid Build Coastguard Worker ... 1978*481dde66SAndroid Build Coastguard Worker} 1979*481dde66SAndroid Build Coastguard Worker... 1980*481dde66SAndroid Build Coastguard Worker MockMutator mutator; 1981*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mutator, Mutate(true, _)) 1982*481dde66SAndroid Build Coastguard Worker .WillOnce(SetArgPointee<1>(5)); 1983*481dde66SAndroid Build Coastguard Worker``` 1984*481dde66SAndroid Build Coastguard Worker 1985*481dde66SAndroid Build Coastguard WorkerIn this example, when `mutator.Mutate()` is called, we will assign 5 to the 1986*481dde66SAndroid Build Coastguard Worker`int` variable pointed to by argument #1 (0-based). 1987*481dde66SAndroid Build Coastguard Worker 1988*481dde66SAndroid Build Coastguard Worker`SetArgPointee()` conveniently makes an internal copy of the value you pass to 1989*481dde66SAndroid Build Coastguard Workerit, removing the need to keep the value in scope and alive. The implication 1990*481dde66SAndroid Build Coastguard Workerhowever is that the value must have a copy constructor and assignment operator. 1991*481dde66SAndroid Build Coastguard Worker 1992*481dde66SAndroid Build Coastguard WorkerIf the mock method also needs to return a value as well, you can chain 1993*481dde66SAndroid Build Coastguard Worker`SetArgPointee()` with `Return()` using `DoAll()`, remembering to put the 1994*481dde66SAndroid Build Coastguard Worker`Return()` statement last: 1995*481dde66SAndroid Build Coastguard Worker 1996*481dde66SAndroid Build Coastguard Worker```cpp 1997*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 1998*481dde66SAndroid Build Coastguard Workerusing ::testing::DoAll; 1999*481dde66SAndroid Build Coastguard Workerusing ::testing::Return; 2000*481dde66SAndroid Build Coastguard Workerusing ::testing::SetArgPointee; 2001*481dde66SAndroid Build Coastguard Worker 2002*481dde66SAndroid Build Coastguard Workerclass MockMutator : public Mutator { 2003*481dde66SAndroid Build Coastguard Worker public: 2004*481dde66SAndroid Build Coastguard Worker ... 2005*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, MutateInt, (int* value), (override)); 2006*481dde66SAndroid Build Coastguard Worker} 2007*481dde66SAndroid Build Coastguard Worker... 2008*481dde66SAndroid Build Coastguard Worker MockMutator mutator; 2009*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mutator, MutateInt(_)) 2010*481dde66SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<0>(5), 2011*481dde66SAndroid Build Coastguard Worker Return(true))); 2012*481dde66SAndroid Build Coastguard Worker``` 2013*481dde66SAndroid Build Coastguard Worker 2014*481dde66SAndroid Build Coastguard WorkerNote, however, that if you use the `ReturnOKWith()` method, it will override the 2015*481dde66SAndroid Build Coastguard Workervalues provided by `SetArgPointee()` in the response parameters of your function 2016*481dde66SAndroid Build Coastguard Workercall. 2017*481dde66SAndroid Build Coastguard Worker 2018*481dde66SAndroid Build Coastguard WorkerIf the output argument is an array, use the `SetArrayArgument<N>(first, last)` 2019*481dde66SAndroid Build Coastguard Workeraction instead. It copies the elements in source range `[first, last)` to the 2020*481dde66SAndroid Build Coastguard Workerarray pointed to by the `N`-th (0-based) argument: 2021*481dde66SAndroid Build Coastguard Worker 2022*481dde66SAndroid Build Coastguard Worker```cpp 2023*481dde66SAndroid Build Coastguard Workerusing ::testing::NotNull; 2024*481dde66SAndroid Build Coastguard Workerusing ::testing::SetArrayArgument; 2025*481dde66SAndroid Build Coastguard Worker 2026*481dde66SAndroid Build Coastguard Workerclass MockArrayMutator : public ArrayMutator { 2027*481dde66SAndroid Build Coastguard Worker public: 2028*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Mutate, (int* values, int num_values), (override)); 2029*481dde66SAndroid Build Coastguard Worker ... 2030*481dde66SAndroid Build Coastguard Worker} 2031*481dde66SAndroid Build Coastguard Worker... 2032*481dde66SAndroid Build Coastguard Worker MockArrayMutator mutator; 2033*481dde66SAndroid Build Coastguard Worker int values[5] = {1, 2, 3, 4, 5}; 2034*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mutator, Mutate(NotNull(), 5)) 2035*481dde66SAndroid Build Coastguard Worker .WillOnce(SetArrayArgument<0>(values, values + 5)); 2036*481dde66SAndroid Build Coastguard Worker``` 2037*481dde66SAndroid Build Coastguard Worker 2038*481dde66SAndroid Build Coastguard WorkerThis also works when the argument is an output iterator: 2039*481dde66SAndroid Build Coastguard Worker 2040*481dde66SAndroid Build Coastguard Worker```cpp 2041*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2042*481dde66SAndroid Build Coastguard Workerusing ::testing::SetArrayArgument; 2043*481dde66SAndroid Build Coastguard Worker 2044*481dde66SAndroid Build Coastguard Workerclass MockRolodex : public Rolodex { 2045*481dde66SAndroid Build Coastguard Worker public: 2046*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, GetNames, (std::back_insert_iterator<vector<string>>), 2047*481dde66SAndroid Build Coastguard Worker (override)); 2048*481dde66SAndroid Build Coastguard Worker ... 2049*481dde66SAndroid Build Coastguard Worker} 2050*481dde66SAndroid Build Coastguard Worker... 2051*481dde66SAndroid Build Coastguard Worker MockRolodex rolodex; 2052*481dde66SAndroid Build Coastguard Worker vector<string> names = {"George", "John", "Thomas"}; 2053*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(rolodex, GetNames(_)) 2054*481dde66SAndroid Build Coastguard Worker .WillOnce(SetArrayArgument<0>(names.begin(), names.end())); 2055*481dde66SAndroid Build Coastguard Worker``` 2056*481dde66SAndroid Build Coastguard Worker 2057*481dde66SAndroid Build Coastguard Worker### Changing a Mock Object's Behavior Based on the State 2058*481dde66SAndroid Build Coastguard Worker 2059*481dde66SAndroid Build Coastguard WorkerIf you expect a call to change the behavior of a mock object, you can use 2060*481dde66SAndroid Build Coastguard Worker`::testing::InSequence` to specify different behaviors before and after the 2061*481dde66SAndroid Build Coastguard Workercall: 2062*481dde66SAndroid Build Coastguard Worker 2063*481dde66SAndroid Build Coastguard Worker```cpp 2064*481dde66SAndroid Build Coastguard Workerusing ::testing::InSequence; 2065*481dde66SAndroid Build Coastguard Workerusing ::testing::Return; 2066*481dde66SAndroid Build Coastguard Worker 2067*481dde66SAndroid Build Coastguard Worker... 2068*481dde66SAndroid Build Coastguard Worker { 2069*481dde66SAndroid Build Coastguard Worker InSequence seq; 2070*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(my_mock, IsDirty()) 2071*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(Return(true)); 2072*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(my_mock, Flush()); 2073*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(my_mock, IsDirty()) 2074*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(Return(false)); 2075*481dde66SAndroid Build Coastguard Worker } 2076*481dde66SAndroid Build Coastguard Worker my_mock.FlushIfDirty(); 2077*481dde66SAndroid Build Coastguard Worker``` 2078*481dde66SAndroid Build Coastguard Worker 2079*481dde66SAndroid Build Coastguard WorkerThis makes `my_mock.IsDirty()` return `true` before `my_mock.Flush()` is called 2080*481dde66SAndroid Build Coastguard Workerand return `false` afterwards. 2081*481dde66SAndroid Build Coastguard Worker 2082*481dde66SAndroid Build Coastguard WorkerIf the behavior change is more complex, you can store the effects in a variable 2083*481dde66SAndroid Build Coastguard Workerand make a mock method get its return value from that variable: 2084*481dde66SAndroid Build Coastguard Worker 2085*481dde66SAndroid Build Coastguard Worker```cpp 2086*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2087*481dde66SAndroid Build Coastguard Workerusing ::testing::SaveArg; 2088*481dde66SAndroid Build Coastguard Workerusing ::testing::Return; 2089*481dde66SAndroid Build Coastguard Worker 2090*481dde66SAndroid Build Coastguard WorkerACTION_P(ReturnPointee, p) { return *p; } 2091*481dde66SAndroid Build Coastguard Worker... 2092*481dde66SAndroid Build Coastguard Worker int previous_value = 0; 2093*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(my_mock, GetPrevValue) 2094*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(ReturnPointee(&previous_value)); 2095*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(my_mock, UpdateValue) 2096*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(SaveArg<0>(&previous_value)); 2097*481dde66SAndroid Build Coastguard Worker my_mock.DoSomethingToUpdateValue(); 2098*481dde66SAndroid Build Coastguard Worker``` 2099*481dde66SAndroid Build Coastguard Worker 2100*481dde66SAndroid Build Coastguard WorkerHere `my_mock.GetPrevValue()` will always return the argument of the last 2101*481dde66SAndroid Build Coastguard Worker`UpdateValue()` call. 2102*481dde66SAndroid Build Coastguard Worker 2103*481dde66SAndroid Build Coastguard Worker### Setting the Default Value for a Return Type {#DefaultValue} 2104*481dde66SAndroid Build Coastguard Worker 2105*481dde66SAndroid Build Coastguard WorkerIf a mock method's return type is a built-in C++ type or pointer, by default it 2106*481dde66SAndroid Build Coastguard Workerwill return 0 when invoked. Also, in C++ 11 and above, a mock method whose 2107*481dde66SAndroid Build Coastguard Workerreturn type has a default constructor will return a default-constructed value by 2108*481dde66SAndroid Build Coastguard Workerdefault. You only need to specify an action if this default value doesn't work 2109*481dde66SAndroid Build Coastguard Workerfor you. 2110*481dde66SAndroid Build Coastguard Worker 2111*481dde66SAndroid Build Coastguard WorkerSometimes, you may want to change this default value, or you may want to specify 2112*481dde66SAndroid Build Coastguard Workera default value for types gMock doesn't know about. You can do this using the 2113*481dde66SAndroid Build Coastguard Worker`::testing::DefaultValue` class template: 2114*481dde66SAndroid Build Coastguard Worker 2115*481dde66SAndroid Build Coastguard Worker```cpp 2116*481dde66SAndroid Build Coastguard Workerusing ::testing::DefaultValue; 2117*481dde66SAndroid Build Coastguard Worker 2118*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 2119*481dde66SAndroid Build Coastguard Worker public: 2120*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(Bar, CalculateBar, (), (override)); 2121*481dde66SAndroid Build Coastguard Worker}; 2122*481dde66SAndroid Build Coastguard Worker 2123*481dde66SAndroid Build Coastguard Worker 2124*481dde66SAndroid Build Coastguard Worker... 2125*481dde66SAndroid Build Coastguard Worker Bar default_bar; 2126*481dde66SAndroid Build Coastguard Worker // Sets the default return value for type Bar. 2127*481dde66SAndroid Build Coastguard Worker DefaultValue<Bar>::Set(default_bar); 2128*481dde66SAndroid Build Coastguard Worker 2129*481dde66SAndroid Build Coastguard Worker MockFoo foo; 2130*481dde66SAndroid Build Coastguard Worker 2131*481dde66SAndroid Build Coastguard Worker // We don't need to specify an action here, as the default 2132*481dde66SAndroid Build Coastguard Worker // return value works for us. 2133*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, CalculateBar()); 2134*481dde66SAndroid Build Coastguard Worker 2135*481dde66SAndroid Build Coastguard Worker foo.CalculateBar(); // This should return default_bar. 2136*481dde66SAndroid Build Coastguard Worker 2137*481dde66SAndroid Build Coastguard Worker // Unsets the default return value. 2138*481dde66SAndroid Build Coastguard Worker DefaultValue<Bar>::Clear(); 2139*481dde66SAndroid Build Coastguard Worker``` 2140*481dde66SAndroid Build Coastguard Worker 2141*481dde66SAndroid Build Coastguard WorkerPlease note that changing the default value for a type can make your tests hard 2142*481dde66SAndroid Build Coastguard Workerto understand. We recommend you to use this feature judiciously. For example, 2143*481dde66SAndroid Build Coastguard Workeryou may want to make sure the `Set()` and `Clear()` calls are right next to the 2144*481dde66SAndroid Build Coastguard Workercode that uses your mock. 2145*481dde66SAndroid Build Coastguard Worker 2146*481dde66SAndroid Build Coastguard Worker### Setting the Default Actions for a Mock Method 2147*481dde66SAndroid Build Coastguard Worker 2148*481dde66SAndroid Build Coastguard WorkerYou've learned how to change the default value of a given type. However, this 2149*481dde66SAndroid Build Coastguard Workermay be too coarse for your purpose: perhaps you have two mock methods with the 2150*481dde66SAndroid Build Coastguard Workersame return type and you want them to have different behaviors. The `ON_CALL()` 2151*481dde66SAndroid Build Coastguard Workermacro allows you to customize your mock's behavior at the method level: 2152*481dde66SAndroid Build Coastguard Worker 2153*481dde66SAndroid Build Coastguard Worker```cpp 2154*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2155*481dde66SAndroid Build Coastguard Workerusing ::testing::AnyNumber; 2156*481dde66SAndroid Build Coastguard Workerusing ::testing::Gt; 2157*481dde66SAndroid Build Coastguard Workerusing ::testing::Return; 2158*481dde66SAndroid Build Coastguard Worker... 2159*481dde66SAndroid Build Coastguard Worker ON_CALL(foo, Sign(_)) 2160*481dde66SAndroid Build Coastguard Worker .WillByDefault(Return(-1)); 2161*481dde66SAndroid Build Coastguard Worker ON_CALL(foo, Sign(0)) 2162*481dde66SAndroid Build Coastguard Worker .WillByDefault(Return(0)); 2163*481dde66SAndroid Build Coastguard Worker ON_CALL(foo, Sign(Gt(0))) 2164*481dde66SAndroid Build Coastguard Worker .WillByDefault(Return(1)); 2165*481dde66SAndroid Build Coastguard Worker 2166*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Sign(_)) 2167*481dde66SAndroid Build Coastguard Worker .Times(AnyNumber()); 2168*481dde66SAndroid Build Coastguard Worker 2169*481dde66SAndroid Build Coastguard Worker foo.Sign(5); // This should return 1. 2170*481dde66SAndroid Build Coastguard Worker foo.Sign(-9); // This should return -1. 2171*481dde66SAndroid Build Coastguard Worker foo.Sign(0); // This should return 0. 2172*481dde66SAndroid Build Coastguard Worker``` 2173*481dde66SAndroid Build Coastguard Worker 2174*481dde66SAndroid Build Coastguard WorkerAs you may have guessed, when there are more than one `ON_CALL()` statements, 2175*481dde66SAndroid Build Coastguard Workerthe newer ones in the order take precedence over the older ones. In other words, 2176*481dde66SAndroid Build Coastguard Workerthe **last** one that matches the function arguments will be used. This matching 2177*481dde66SAndroid Build Coastguard Workerorder allows you to set up the common behavior in a mock object's constructor or 2178*481dde66SAndroid Build Coastguard Workerthe test fixture's set-up phase and specialize the mock's behavior later. 2179*481dde66SAndroid Build Coastguard Worker 2180*481dde66SAndroid Build Coastguard WorkerNote that both `ON_CALL` and `EXPECT_CALL` have the same "later statements take 2181*481dde66SAndroid Build Coastguard Workerprecedence" rule, but they don't interact. That is, `EXPECT_CALL`s have their 2182*481dde66SAndroid Build Coastguard Workerown precedence order distinct from the `ON_CALL` precedence order. 2183*481dde66SAndroid Build Coastguard Worker 2184*481dde66SAndroid Build Coastguard Worker### Using Functions/Methods/Functors/Lambdas as Actions {#FunctionsAsActions} 2185*481dde66SAndroid Build Coastguard Worker 2186*481dde66SAndroid Build Coastguard WorkerIf the built-in actions don't suit you, you can use an existing callable 2187*481dde66SAndroid Build Coastguard Worker(function, `std::function`, method, functor, lambda) as an action. 2188*481dde66SAndroid Build Coastguard Worker 2189*481dde66SAndroid Build Coastguard Worker```cpp 2190*481dde66SAndroid Build Coastguard Workerusing ::testing::_; using ::testing::Invoke; 2191*481dde66SAndroid Build Coastguard Worker 2192*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 2193*481dde66SAndroid Build Coastguard Worker public: 2194*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(int, Sum, (int x, int y), (override)); 2195*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, ComplexJob, (int x), (override)); 2196*481dde66SAndroid Build Coastguard Worker}; 2197*481dde66SAndroid Build Coastguard Worker 2198*481dde66SAndroid Build Coastguard Workerint CalculateSum(int x, int y) { return x + y; } 2199*481dde66SAndroid Build Coastguard Workerint Sum3(int x, int y, int z) { return x + y + z; } 2200*481dde66SAndroid Build Coastguard Worker 2201*481dde66SAndroid Build Coastguard Workerclass Helper { 2202*481dde66SAndroid Build Coastguard Worker public: 2203*481dde66SAndroid Build Coastguard Worker bool ComplexJob(int x); 2204*481dde66SAndroid Build Coastguard Worker}; 2205*481dde66SAndroid Build Coastguard Worker 2206*481dde66SAndroid Build Coastguard Worker... 2207*481dde66SAndroid Build Coastguard Worker MockFoo foo; 2208*481dde66SAndroid Build Coastguard Worker Helper helper; 2209*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Sum(_, _)) 2210*481dde66SAndroid Build Coastguard Worker .WillOnce(&CalculateSum) 2211*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(Invoke(NewPermanentCallback(Sum3, 1))); 2212*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, ComplexJob(_)) 2213*481dde66SAndroid Build Coastguard Worker .WillOnce(Invoke(&helper, &Helper::ComplexJob)) 2214*481dde66SAndroid Build Coastguard Worker .WillOnce([] { return true; }) 2215*481dde66SAndroid Build Coastguard Worker .WillRepeatedly([](int x) { return x > 0; }); 2216*481dde66SAndroid Build Coastguard Worker 2217*481dde66SAndroid Build Coastguard Worker foo.Sum(5, 6); // Invokes CalculateSum(5, 6). 2218*481dde66SAndroid Build Coastguard Worker foo.Sum(2, 3); // Invokes Sum3(1, 2, 3). 2219*481dde66SAndroid Build Coastguard Worker foo.ComplexJob(10); // Invokes helper.ComplexJob(10). 2220*481dde66SAndroid Build Coastguard Worker foo.ComplexJob(-1); // Invokes the inline lambda. 2221*481dde66SAndroid Build Coastguard Worker``` 2222*481dde66SAndroid Build Coastguard Worker 2223*481dde66SAndroid Build Coastguard WorkerThe only requirement is that the type of the function, etc must be *compatible* 2224*481dde66SAndroid Build Coastguard Workerwith the signature of the mock function, meaning that the latter's arguments (if 2225*481dde66SAndroid Build Coastguard Workerit takes any) can be implicitly converted to the corresponding arguments of the 2226*481dde66SAndroid Build Coastguard Workerformer, and the former's return type can be implicitly converted to that of the 2227*481dde66SAndroid Build Coastguard Workerlatter. So, you can invoke something whose type is *not* exactly the same as the 2228*481dde66SAndroid Build Coastguard Workermock function, as long as it's safe to do so - nice, huh? 2229*481dde66SAndroid Build Coastguard Worker 2230*481dde66SAndroid Build Coastguard WorkerNote that: 2231*481dde66SAndroid Build Coastguard Worker 2232*481dde66SAndroid Build Coastguard Worker* The action takes ownership of the callback and will delete it when the 2233*481dde66SAndroid Build Coastguard Worker action itself is destructed. 2234*481dde66SAndroid Build Coastguard Worker* If the type of a callback is derived from a base callback type `C`, you need 2235*481dde66SAndroid Build Coastguard Worker to implicitly cast it to `C` to resolve the overloading, e.g. 2236*481dde66SAndroid Build Coastguard Worker 2237*481dde66SAndroid Build Coastguard Worker ```cpp 2238*481dde66SAndroid Build Coastguard Worker using ::testing::Invoke; 2239*481dde66SAndroid Build Coastguard Worker ... 2240*481dde66SAndroid Build Coastguard Worker ResultCallback<bool>* is_ok = ...; 2241*481dde66SAndroid Build Coastguard Worker ... Invoke(is_ok) ...; // This works. 2242*481dde66SAndroid Build Coastguard Worker 2243*481dde66SAndroid Build Coastguard Worker BlockingClosure* done = new BlockingClosure; 2244*481dde66SAndroid Build Coastguard Worker ... Invoke(implicit_cast<Closure*>(done)) ...; // The cast is necessary. 2245*481dde66SAndroid Build Coastguard Worker ``` 2246*481dde66SAndroid Build Coastguard Worker 2247*481dde66SAndroid Build Coastguard Worker### Using Functions with Extra Info as Actions 2248*481dde66SAndroid Build Coastguard Worker 2249*481dde66SAndroid Build Coastguard WorkerThe function or functor you call using `Invoke()` must have the same number of 2250*481dde66SAndroid Build Coastguard Workerarguments as the mock function you use it for. Sometimes you may have a function 2251*481dde66SAndroid Build Coastguard Workerthat takes more arguments, and you are willing to pass in the extra arguments 2252*481dde66SAndroid Build Coastguard Workeryourself to fill the gap. You can do this in gMock using callbacks with 2253*481dde66SAndroid Build Coastguard Workerpre-bound arguments. Here's an example: 2254*481dde66SAndroid Build Coastguard Worker 2255*481dde66SAndroid Build Coastguard Worker```cpp 2256*481dde66SAndroid Build Coastguard Workerusing ::testing::Invoke; 2257*481dde66SAndroid Build Coastguard Worker 2258*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 2259*481dde66SAndroid Build Coastguard Worker public: 2260*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(char, DoThis, (int n), (override)); 2261*481dde66SAndroid Build Coastguard Worker}; 2262*481dde66SAndroid Build Coastguard Worker 2263*481dde66SAndroid Build Coastguard Workerchar SignOfSum(int x, int y) { 2264*481dde66SAndroid Build Coastguard Worker const int sum = x + y; 2265*481dde66SAndroid Build Coastguard Worker return (sum > 0) ? '+' : (sum < 0) ? '-' : '0'; 2266*481dde66SAndroid Build Coastguard Worker} 2267*481dde66SAndroid Build Coastguard Worker 2268*481dde66SAndroid Build Coastguard WorkerTEST_F(FooTest, Test) { 2269*481dde66SAndroid Build Coastguard Worker MockFoo foo; 2270*481dde66SAndroid Build Coastguard Worker 2271*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(2)) 2272*481dde66SAndroid Build Coastguard Worker .WillOnce(Invoke(NewPermanentCallback(SignOfSum, 5))); 2273*481dde66SAndroid Build Coastguard Worker EXPECT_EQ(foo.DoThis(2), '+'); // Invokes SignOfSum(5, 2). 2274*481dde66SAndroid Build Coastguard Worker} 2275*481dde66SAndroid Build Coastguard Worker``` 2276*481dde66SAndroid Build Coastguard Worker 2277*481dde66SAndroid Build Coastguard Worker### Invoking a Function/Method/Functor/Lambda/Callback Without Arguments 2278*481dde66SAndroid Build Coastguard Worker 2279*481dde66SAndroid Build Coastguard Worker`Invoke()` passes the mock function's arguments to the function, etc being 2280*481dde66SAndroid Build Coastguard Workerinvoked such that the callee has the full context of the call to work with. If 2281*481dde66SAndroid Build Coastguard Workerthe invoked function is not interested in some or all of the arguments, it can 2282*481dde66SAndroid Build Coastguard Workersimply ignore them. 2283*481dde66SAndroid Build Coastguard Worker 2284*481dde66SAndroid Build Coastguard WorkerYet, a common pattern is that a test author wants to invoke a function without 2285*481dde66SAndroid Build Coastguard Workerthe arguments of the mock function. She could do that using a wrapper function 2286*481dde66SAndroid Build Coastguard Workerthat throws away the arguments before invoking an underlining nullary function. 2287*481dde66SAndroid Build Coastguard WorkerNeedless to say, this can be tedious and obscures the intent of the test. 2288*481dde66SAndroid Build Coastguard Worker 2289*481dde66SAndroid Build Coastguard WorkerThere are two solutions to this problem. First, you can pass any callable of 2290*481dde66SAndroid Build Coastguard Workerzero args as an action. Alternatively, use `InvokeWithoutArgs()`, which is like 2291*481dde66SAndroid Build Coastguard Worker`Invoke()` except that it doesn't pass the mock function's arguments to the 2292*481dde66SAndroid Build Coastguard Workercallee. Here's an example of each: 2293*481dde66SAndroid Build Coastguard Worker 2294*481dde66SAndroid Build Coastguard Worker```cpp 2295*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2296*481dde66SAndroid Build Coastguard Workerusing ::testing::InvokeWithoutArgs; 2297*481dde66SAndroid Build Coastguard Worker 2298*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 2299*481dde66SAndroid Build Coastguard Worker public: 2300*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, ComplexJob, (int n), (override)); 2301*481dde66SAndroid Build Coastguard Worker}; 2302*481dde66SAndroid Build Coastguard Worker 2303*481dde66SAndroid Build Coastguard Workerbool Job1() { ... } 2304*481dde66SAndroid Build Coastguard Workerbool Job2(int n, char c) { ... } 2305*481dde66SAndroid Build Coastguard Worker 2306*481dde66SAndroid Build Coastguard Worker... 2307*481dde66SAndroid Build Coastguard Worker MockFoo foo; 2308*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, ComplexJob(_)) 2309*481dde66SAndroid Build Coastguard Worker .WillOnce([] { Job1(); }); 2310*481dde66SAndroid Build Coastguard Worker .WillOnce(InvokeWithoutArgs(NewPermanentCallback(Job2, 5, 'a'))); 2311*481dde66SAndroid Build Coastguard Worker 2312*481dde66SAndroid Build Coastguard Worker foo.ComplexJob(10); // Invokes Job1(). 2313*481dde66SAndroid Build Coastguard Worker foo.ComplexJob(20); // Invokes Job2(5, 'a'). 2314*481dde66SAndroid Build Coastguard Worker``` 2315*481dde66SAndroid Build Coastguard Worker 2316*481dde66SAndroid Build Coastguard WorkerNote that: 2317*481dde66SAndroid Build Coastguard Worker 2318*481dde66SAndroid Build Coastguard Worker* The action takes ownership of the callback and will delete it when the 2319*481dde66SAndroid Build Coastguard Worker action itself is destructed. 2320*481dde66SAndroid Build Coastguard Worker* If the type of a callback is derived from a base callback type `C`, you need 2321*481dde66SAndroid Build Coastguard Worker to implicitly cast it to `C` to resolve the overloading, e.g. 2322*481dde66SAndroid Build Coastguard Worker 2323*481dde66SAndroid Build Coastguard Worker ```cpp 2324*481dde66SAndroid Build Coastguard Worker using ::testing::InvokeWithoutArgs; 2325*481dde66SAndroid Build Coastguard Worker ... 2326*481dde66SAndroid Build Coastguard Worker ResultCallback<bool>* is_ok = ...; 2327*481dde66SAndroid Build Coastguard Worker ... InvokeWithoutArgs(is_ok) ...; // This works. 2328*481dde66SAndroid Build Coastguard Worker 2329*481dde66SAndroid Build Coastguard Worker BlockingClosure* done = ...; 2330*481dde66SAndroid Build Coastguard Worker ... InvokeWithoutArgs(implicit_cast<Closure*>(done)) ...; 2331*481dde66SAndroid Build Coastguard Worker // The cast is necessary. 2332*481dde66SAndroid Build Coastguard Worker ``` 2333*481dde66SAndroid Build Coastguard Worker 2334*481dde66SAndroid Build Coastguard Worker### Invoking an Argument of the Mock Function 2335*481dde66SAndroid Build Coastguard Worker 2336*481dde66SAndroid Build Coastguard WorkerSometimes a mock function will receive a function pointer, a functor (in other 2337*481dde66SAndroid Build Coastguard Workerwords, a "callable") as an argument, e.g. 2338*481dde66SAndroid Build Coastguard Worker 2339*481dde66SAndroid Build Coastguard Worker```cpp 2340*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 2341*481dde66SAndroid Build Coastguard Worker public: 2342*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, DoThis, (int n, (ResultCallback1<bool, int>* callback)), 2343*481dde66SAndroid Build Coastguard Worker (override)); 2344*481dde66SAndroid Build Coastguard Worker}; 2345*481dde66SAndroid Build Coastguard Worker``` 2346*481dde66SAndroid Build Coastguard Worker 2347*481dde66SAndroid Build Coastguard Workerand you may want to invoke this callable argument: 2348*481dde66SAndroid Build Coastguard Worker 2349*481dde66SAndroid Build Coastguard Worker```cpp 2350*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2351*481dde66SAndroid Build Coastguard Worker... 2352*481dde66SAndroid Build Coastguard Worker MockFoo foo; 2353*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(_, _)) 2354*481dde66SAndroid Build Coastguard Worker .WillOnce(...); 2355*481dde66SAndroid Build Coastguard Worker // Will execute callback->Run(5), where callback is the 2356*481dde66SAndroid Build Coastguard Worker // second argument DoThis() receives. 2357*481dde66SAndroid Build Coastguard Worker``` 2358*481dde66SAndroid Build Coastguard Worker 2359*481dde66SAndroid Build Coastguard Worker{: .callout .note} 2360*481dde66SAndroid Build Coastguard WorkerNOTE: The section below is legacy documentation from before C++ had lambdas: 2361*481dde66SAndroid Build Coastguard Worker 2362*481dde66SAndroid Build Coastguard WorkerArghh, you need to refer to a mock function argument but C++ has no lambda 2363*481dde66SAndroid Build Coastguard Worker(yet), so you have to define your own action. :-( Or do you really? 2364*481dde66SAndroid Build Coastguard Worker 2365*481dde66SAndroid Build Coastguard WorkerWell, gMock has an action to solve *exactly* this problem: 2366*481dde66SAndroid Build Coastguard Worker 2367*481dde66SAndroid Build Coastguard Worker```cpp 2368*481dde66SAndroid Build Coastguard WorkerInvokeArgument<N>(arg_1, arg_2, ..., arg_m) 2369*481dde66SAndroid Build Coastguard Worker``` 2370*481dde66SAndroid Build Coastguard Worker 2371*481dde66SAndroid Build Coastguard Workerwill invoke the `N`-th (0-based) argument the mock function receives, with 2372*481dde66SAndroid Build Coastguard Worker`arg_1`, `arg_2`, ..., and `arg_m`. No matter if the argument is a function 2373*481dde66SAndroid Build Coastguard Workerpointer, a functor, or a callback. gMock handles them all. 2374*481dde66SAndroid Build Coastguard Worker 2375*481dde66SAndroid Build Coastguard WorkerWith that, you could write: 2376*481dde66SAndroid Build Coastguard Worker 2377*481dde66SAndroid Build Coastguard Worker```cpp 2378*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2379*481dde66SAndroid Build Coastguard Workerusing ::testing::InvokeArgument; 2380*481dde66SAndroid Build Coastguard Worker... 2381*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis(_, _)) 2382*481dde66SAndroid Build Coastguard Worker .WillOnce(InvokeArgument<1>(5)); 2383*481dde66SAndroid Build Coastguard Worker // Will execute callback->Run(5), where callback is the 2384*481dde66SAndroid Build Coastguard Worker // second argument DoThis() receives. 2385*481dde66SAndroid Build Coastguard Worker``` 2386*481dde66SAndroid Build Coastguard Worker 2387*481dde66SAndroid Build Coastguard WorkerWhat if the callable takes an argument by reference? No problem - just wrap it 2388*481dde66SAndroid Build Coastguard Workerinside `std::ref()`: 2389*481dde66SAndroid Build Coastguard Worker 2390*481dde66SAndroid Build Coastguard Worker```cpp 2391*481dde66SAndroid Build Coastguard Worker ... 2392*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, Bar, 2393*481dde66SAndroid Build Coastguard Worker ((ResultCallback2<bool, int, const Helper&>* callback)), 2394*481dde66SAndroid Build Coastguard Worker (override)); 2395*481dde66SAndroid Build Coastguard Worker ... 2396*481dde66SAndroid Build Coastguard Worker using ::testing::_; 2397*481dde66SAndroid Build Coastguard Worker using ::testing::InvokeArgument; 2398*481dde66SAndroid Build Coastguard Worker ... 2399*481dde66SAndroid Build Coastguard Worker MockFoo foo; 2400*481dde66SAndroid Build Coastguard Worker Helper helper; 2401*481dde66SAndroid Build Coastguard Worker ... 2402*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(_)) 2403*481dde66SAndroid Build Coastguard Worker .WillOnce(InvokeArgument<0>(5, std::ref(helper))); 2404*481dde66SAndroid Build Coastguard Worker // std::ref(helper) guarantees that a reference to helper, not a copy of 2405*481dde66SAndroid Build Coastguard Worker // it, will be passed to the callback. 2406*481dde66SAndroid Build Coastguard Worker``` 2407*481dde66SAndroid Build Coastguard Worker 2408*481dde66SAndroid Build Coastguard WorkerWhat if the callable takes an argument by reference and we do **not** wrap the 2409*481dde66SAndroid Build Coastguard Workerargument in `std::ref()`? Then `InvokeArgument()` will *make a copy* of the 2410*481dde66SAndroid Build Coastguard Workerargument, and pass a *reference to the copy*, instead of a reference to the 2411*481dde66SAndroid Build Coastguard Workeroriginal value, to the callable. This is especially handy when the argument is a 2412*481dde66SAndroid Build Coastguard Workertemporary value: 2413*481dde66SAndroid Build Coastguard Worker 2414*481dde66SAndroid Build Coastguard Worker```cpp 2415*481dde66SAndroid Build Coastguard Worker ... 2416*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, DoThat, (bool (*f)(const double& x, const string& s)), 2417*481dde66SAndroid Build Coastguard Worker (override)); 2418*481dde66SAndroid Build Coastguard Worker ... 2419*481dde66SAndroid Build Coastguard Worker using ::testing::_; 2420*481dde66SAndroid Build Coastguard Worker using ::testing::InvokeArgument; 2421*481dde66SAndroid Build Coastguard Worker ... 2422*481dde66SAndroid Build Coastguard Worker MockFoo foo; 2423*481dde66SAndroid Build Coastguard Worker ... 2424*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThat(_)) 2425*481dde66SAndroid Build Coastguard Worker .WillOnce(InvokeArgument<0>(5.0, string("Hi"))); 2426*481dde66SAndroid Build Coastguard Worker // Will execute (*f)(5.0, string("Hi")), where f is the function pointer 2427*481dde66SAndroid Build Coastguard Worker // DoThat() receives. Note that the values 5.0 and string("Hi") are 2428*481dde66SAndroid Build Coastguard Worker // temporary and dead once the EXPECT_CALL() statement finishes. Yet 2429*481dde66SAndroid Build Coastguard Worker // it's fine to perform this action later, since a copy of the values 2430*481dde66SAndroid Build Coastguard Worker // are kept inside the InvokeArgument action. 2431*481dde66SAndroid Build Coastguard Worker``` 2432*481dde66SAndroid Build Coastguard Worker 2433*481dde66SAndroid Build Coastguard Worker### Ignoring an Action's Result 2434*481dde66SAndroid Build Coastguard Worker 2435*481dde66SAndroid Build Coastguard WorkerSometimes you have an action that returns *something*, but you need an action 2436*481dde66SAndroid Build Coastguard Workerthat returns `void` (perhaps you want to use it in a mock function that returns 2437*481dde66SAndroid Build Coastguard Worker`void`, or perhaps it needs to be used in `DoAll()` and it's not the last in the 2438*481dde66SAndroid Build Coastguard Workerlist). `IgnoreResult()` lets you do that. For example: 2439*481dde66SAndroid Build Coastguard Worker 2440*481dde66SAndroid Build Coastguard Worker```cpp 2441*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2442*481dde66SAndroid Build Coastguard Workerusing ::testing::DoAll; 2443*481dde66SAndroid Build Coastguard Workerusing ::testing::IgnoreResult; 2444*481dde66SAndroid Build Coastguard Workerusing ::testing::Return; 2445*481dde66SAndroid Build Coastguard Worker 2446*481dde66SAndroid Build Coastguard Workerint Process(const MyData& data); 2447*481dde66SAndroid Build Coastguard Workerstring DoSomething(); 2448*481dde66SAndroid Build Coastguard Worker 2449*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 2450*481dde66SAndroid Build Coastguard Worker public: 2451*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Abc, (const MyData& data), (override)); 2452*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, Xyz, (), (override)); 2453*481dde66SAndroid Build Coastguard Worker}; 2454*481dde66SAndroid Build Coastguard Worker 2455*481dde66SAndroid Build Coastguard Worker ... 2456*481dde66SAndroid Build Coastguard Worker MockFoo foo; 2457*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Abc(_)) 2458*481dde66SAndroid Build Coastguard Worker // .WillOnce(Invoke(Process)); 2459*481dde66SAndroid Build Coastguard Worker // The above line won't compile as Process() returns int but Abc() needs 2460*481dde66SAndroid Build Coastguard Worker // to return void. 2461*481dde66SAndroid Build Coastguard Worker .WillOnce(IgnoreResult(Process)); 2462*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Xyz()) 2463*481dde66SAndroid Build Coastguard Worker .WillOnce(DoAll(IgnoreResult(DoSomething), 2464*481dde66SAndroid Build Coastguard Worker // Ignores the string DoSomething() returns. 2465*481dde66SAndroid Build Coastguard Worker Return(true))); 2466*481dde66SAndroid Build Coastguard Worker``` 2467*481dde66SAndroid Build Coastguard Worker 2468*481dde66SAndroid Build Coastguard WorkerNote that you **cannot** use `IgnoreResult()` on an action that already returns 2469*481dde66SAndroid Build Coastguard Worker`void`. Doing so will lead to ugly compiler errors. 2470*481dde66SAndroid Build Coastguard Worker 2471*481dde66SAndroid Build Coastguard Worker### Selecting an Action's Arguments {#SelectingArgs} 2472*481dde66SAndroid Build Coastguard Worker 2473*481dde66SAndroid Build Coastguard WorkerSay you have a mock function `Foo()` that takes seven arguments, and you have a 2474*481dde66SAndroid Build Coastguard Workercustom action that you want to invoke when `Foo()` is called. Trouble is, the 2475*481dde66SAndroid Build Coastguard Workercustom action only wants three arguments: 2476*481dde66SAndroid Build Coastguard Worker 2477*481dde66SAndroid Build Coastguard Worker```cpp 2478*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2479*481dde66SAndroid Build Coastguard Workerusing ::testing::Invoke; 2480*481dde66SAndroid Build Coastguard Worker... 2481*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, Foo, 2482*481dde66SAndroid Build Coastguard Worker (bool visible, const string& name, int x, int y, 2483*481dde66SAndroid Build Coastguard Worker (const map<pair<int, int>>), double& weight, double min_weight, 2484*481dde66SAndroid Build Coastguard Worker double max_wight)); 2485*481dde66SAndroid Build Coastguard Worker... 2486*481dde66SAndroid Build Coastguard Workerbool IsVisibleInQuadrant1(bool visible, int x, int y) { 2487*481dde66SAndroid Build Coastguard Worker return visible && x >= 0 && y >= 0; 2488*481dde66SAndroid Build Coastguard Worker} 2489*481dde66SAndroid Build Coastguard Worker... 2490*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo) 2491*481dde66SAndroid Build Coastguard Worker .WillOnce(Invoke(IsVisibleInQuadrant1)); // Uh, won't compile. :-( 2492*481dde66SAndroid Build Coastguard Worker``` 2493*481dde66SAndroid Build Coastguard Worker 2494*481dde66SAndroid Build Coastguard WorkerTo please the compiler God, you need to define an "adaptor" that has the same 2495*481dde66SAndroid Build Coastguard Workersignature as `Foo()` and calls the custom action with the right arguments: 2496*481dde66SAndroid Build Coastguard Worker 2497*481dde66SAndroid Build Coastguard Worker```cpp 2498*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2499*481dde66SAndroid Build Coastguard Workerusing ::testing::Invoke; 2500*481dde66SAndroid Build Coastguard Worker... 2501*481dde66SAndroid Build Coastguard Workerbool MyIsVisibleInQuadrant1(bool visible, const string& name, int x, int y, 2502*481dde66SAndroid Build Coastguard Worker const map<pair<int, int>, double>& weight, 2503*481dde66SAndroid Build Coastguard Worker double min_weight, double max_wight) { 2504*481dde66SAndroid Build Coastguard Worker return IsVisibleInQuadrant1(visible, x, y); 2505*481dde66SAndroid Build Coastguard Worker} 2506*481dde66SAndroid Build Coastguard Worker... 2507*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo) 2508*481dde66SAndroid Build Coastguard Worker .WillOnce(Invoke(MyIsVisibleInQuadrant1)); // Now it works. 2509*481dde66SAndroid Build Coastguard Worker``` 2510*481dde66SAndroid Build Coastguard Worker 2511*481dde66SAndroid Build Coastguard WorkerBut isn't this awkward? 2512*481dde66SAndroid Build Coastguard Worker 2513*481dde66SAndroid Build Coastguard WorkergMock provides a generic *action adaptor*, so you can spend your time minding 2514*481dde66SAndroid Build Coastguard Workermore important business than writing your own adaptors. Here's the syntax: 2515*481dde66SAndroid Build Coastguard Worker 2516*481dde66SAndroid Build Coastguard Worker```cpp 2517*481dde66SAndroid Build Coastguard WorkerWithArgs<N1, N2, ..., Nk>(action) 2518*481dde66SAndroid Build Coastguard Worker``` 2519*481dde66SAndroid Build Coastguard Worker 2520*481dde66SAndroid Build Coastguard Workercreates an action that passes the arguments of the mock function at the given 2521*481dde66SAndroid Build Coastguard Workerindices (0-based) to the inner `action` and performs it. Using `WithArgs`, our 2522*481dde66SAndroid Build Coastguard Workeroriginal example can be written as: 2523*481dde66SAndroid Build Coastguard Worker 2524*481dde66SAndroid Build Coastguard Worker```cpp 2525*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2526*481dde66SAndroid Build Coastguard Workerusing ::testing::Invoke; 2527*481dde66SAndroid Build Coastguard Workerusing ::testing::WithArgs; 2528*481dde66SAndroid Build Coastguard Worker... 2529*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo) 2530*481dde66SAndroid Build Coastguard Worker .WillOnce(WithArgs<0, 2, 3>(Invoke(IsVisibleInQuadrant1))); // No need to define your own adaptor. 2531*481dde66SAndroid Build Coastguard Worker``` 2532*481dde66SAndroid Build Coastguard Worker 2533*481dde66SAndroid Build Coastguard WorkerFor better readability, gMock also gives you: 2534*481dde66SAndroid Build Coastguard Worker 2535*481dde66SAndroid Build Coastguard Worker* `WithoutArgs(action)` when the inner `action` takes *no* argument, and 2536*481dde66SAndroid Build Coastguard Worker* `WithArg<N>(action)` (no `s` after `Arg`) when the inner `action` takes 2537*481dde66SAndroid Build Coastguard Worker *one* argument. 2538*481dde66SAndroid Build Coastguard Worker 2539*481dde66SAndroid Build Coastguard WorkerAs you may have realized, `InvokeWithoutArgs(...)` is just syntactic sugar for 2540*481dde66SAndroid Build Coastguard Worker`WithoutArgs(Invoke(...))`. 2541*481dde66SAndroid Build Coastguard Worker 2542*481dde66SAndroid Build Coastguard WorkerHere are more tips: 2543*481dde66SAndroid Build Coastguard Worker 2544*481dde66SAndroid Build Coastguard Worker* The inner action used in `WithArgs` and friends does not have to be 2545*481dde66SAndroid Build Coastguard Worker `Invoke()` -- it can be anything. 2546*481dde66SAndroid Build Coastguard Worker* You can repeat an argument in the argument list if necessary, e.g. 2547*481dde66SAndroid Build Coastguard Worker `WithArgs<2, 3, 3, 5>(...)`. 2548*481dde66SAndroid Build Coastguard Worker* You can change the order of the arguments, e.g. `WithArgs<3, 2, 1>(...)`. 2549*481dde66SAndroid Build Coastguard Worker* The types of the selected arguments do *not* have to match the signature of 2550*481dde66SAndroid Build Coastguard Worker the inner action exactly. It works as long as they can be implicitly 2551*481dde66SAndroid Build Coastguard Worker converted to the corresponding arguments of the inner action. For example, 2552*481dde66SAndroid Build Coastguard Worker if the 4-th argument of the mock function is an `int` and `my_action` takes 2553*481dde66SAndroid Build Coastguard Worker a `double`, `WithArg<4>(my_action)` will work. 2554*481dde66SAndroid Build Coastguard Worker 2555*481dde66SAndroid Build Coastguard Worker### Ignoring Arguments in Action Functions 2556*481dde66SAndroid Build Coastguard Worker 2557*481dde66SAndroid Build Coastguard WorkerThe [selecting-an-action's-arguments](#SelectingArgs) recipe showed us one way 2558*481dde66SAndroid Build Coastguard Workerto make a mock function and an action with incompatible argument lists fit 2559*481dde66SAndroid Build Coastguard Workertogether. The downside is that wrapping the action in `WithArgs<...>()` can get 2560*481dde66SAndroid Build Coastguard Workertedious for people writing the tests. 2561*481dde66SAndroid Build Coastguard Worker 2562*481dde66SAndroid Build Coastguard WorkerIf you are defining a function (or method, functor, lambda, callback) to be used 2563*481dde66SAndroid Build Coastguard Workerwith `Invoke*()`, and you are not interested in some of its arguments, an 2564*481dde66SAndroid Build Coastguard Workeralternative to `WithArgs` is to declare the uninteresting arguments as `Unused`. 2565*481dde66SAndroid Build Coastguard WorkerThis makes the definition less cluttered and less fragile in case the types of 2566*481dde66SAndroid Build Coastguard Workerthe uninteresting arguments change. It could also increase the chance the action 2567*481dde66SAndroid Build Coastguard Workerfunction can be reused. For example, given 2568*481dde66SAndroid Build Coastguard Worker 2569*481dde66SAndroid Build Coastguard Worker```cpp 2570*481dde66SAndroid Build Coastguard Worker public: 2571*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(double, Foo, double(const string& label, double x, double y), 2572*481dde66SAndroid Build Coastguard Worker (override)); 2573*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(double, Bar, (int index, double x, double y), (override)); 2574*481dde66SAndroid Build Coastguard Worker``` 2575*481dde66SAndroid Build Coastguard Worker 2576*481dde66SAndroid Build Coastguard Workerinstead of 2577*481dde66SAndroid Build Coastguard Worker 2578*481dde66SAndroid Build Coastguard Worker```cpp 2579*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2580*481dde66SAndroid Build Coastguard Workerusing ::testing::Invoke; 2581*481dde66SAndroid Build Coastguard Worker 2582*481dde66SAndroid Build Coastguard Workerdouble DistanceToOriginWithLabel(const string& label, double x, double y) { 2583*481dde66SAndroid Build Coastguard Worker return sqrt(x*x + y*y); 2584*481dde66SAndroid Build Coastguard Worker} 2585*481dde66SAndroid Build Coastguard Workerdouble DistanceToOriginWithIndex(int index, double x, double y) { 2586*481dde66SAndroid Build Coastguard Worker return sqrt(x*x + y*y); 2587*481dde66SAndroid Build Coastguard Worker} 2588*481dde66SAndroid Build Coastguard Worker... 2589*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo("abc", _, _)) 2590*481dde66SAndroid Build Coastguard Worker .WillOnce(Invoke(DistanceToOriginWithLabel)); 2591*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Bar(5, _, _)) 2592*481dde66SAndroid Build Coastguard Worker .WillOnce(Invoke(DistanceToOriginWithIndex)); 2593*481dde66SAndroid Build Coastguard Worker``` 2594*481dde66SAndroid Build Coastguard Worker 2595*481dde66SAndroid Build Coastguard Workeryou could write 2596*481dde66SAndroid Build Coastguard Worker 2597*481dde66SAndroid Build Coastguard Worker```cpp 2598*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 2599*481dde66SAndroid Build Coastguard Workerusing ::testing::Invoke; 2600*481dde66SAndroid Build Coastguard Workerusing ::testing::Unused; 2601*481dde66SAndroid Build Coastguard Worker 2602*481dde66SAndroid Build Coastguard Workerdouble DistanceToOrigin(Unused, double x, double y) { 2603*481dde66SAndroid Build Coastguard Worker return sqrt(x*x + y*y); 2604*481dde66SAndroid Build Coastguard Worker} 2605*481dde66SAndroid Build Coastguard Worker... 2606*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo("abc", _, _)) 2607*481dde66SAndroid Build Coastguard Worker .WillOnce(Invoke(DistanceToOrigin)); 2608*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Bar(5, _, _)) 2609*481dde66SAndroid Build Coastguard Worker .WillOnce(Invoke(DistanceToOrigin)); 2610*481dde66SAndroid Build Coastguard Worker``` 2611*481dde66SAndroid Build Coastguard Worker 2612*481dde66SAndroid Build Coastguard Worker### Sharing Actions 2613*481dde66SAndroid Build Coastguard Worker 2614*481dde66SAndroid Build Coastguard WorkerJust like matchers, a gMock action object consists of a pointer to a ref-counted 2615*481dde66SAndroid Build Coastguard Workerimplementation object. Therefore copying actions is also allowed and very 2616*481dde66SAndroid Build Coastguard Workerefficient. When the last action that references the implementation object dies, 2617*481dde66SAndroid Build Coastguard Workerthe implementation object will be deleted. 2618*481dde66SAndroid Build Coastguard Worker 2619*481dde66SAndroid Build Coastguard WorkerIf you have some complex action that you want to use again and again, you may 2620*481dde66SAndroid Build Coastguard Workernot have to build it from scratch every time. If the action doesn't have an 2621*481dde66SAndroid Build Coastguard Workerinternal state (i.e. if it always does the same thing no matter how many times 2622*481dde66SAndroid Build Coastguard Workerit has been called), you can assign it to an action variable and use that 2623*481dde66SAndroid Build Coastguard Workervariable repeatedly. For example: 2624*481dde66SAndroid Build Coastguard Worker 2625*481dde66SAndroid Build Coastguard Worker```cpp 2626*481dde66SAndroid Build Coastguard Workerusing ::testing::Action; 2627*481dde66SAndroid Build Coastguard Workerusing ::testing::DoAll; 2628*481dde66SAndroid Build Coastguard Workerusing ::testing::Return; 2629*481dde66SAndroid Build Coastguard Workerusing ::testing::SetArgPointee; 2630*481dde66SAndroid Build Coastguard Worker... 2631*481dde66SAndroid Build Coastguard Worker Action<bool(int*)> set_flag = DoAll(SetArgPointee<0>(5), 2632*481dde66SAndroid Build Coastguard Worker Return(true)); 2633*481dde66SAndroid Build Coastguard Worker ... use set_flag in .WillOnce() and .WillRepeatedly() ... 2634*481dde66SAndroid Build Coastguard Worker``` 2635*481dde66SAndroid Build Coastguard Worker 2636*481dde66SAndroid Build Coastguard WorkerHowever, if the action has its own state, you may be surprised if you share the 2637*481dde66SAndroid Build Coastguard Workeraction object. Suppose you have an action factory `IncrementCounter(init)` which 2638*481dde66SAndroid Build Coastguard Workercreates an action that increments and returns a counter whose initial value is 2639*481dde66SAndroid Build Coastguard Worker`init`, using two actions created from the same expression and using a shared 2640*481dde66SAndroid Build Coastguard Workeraction will exhibit different behaviors. Example: 2641*481dde66SAndroid Build Coastguard Worker 2642*481dde66SAndroid Build Coastguard Worker```cpp 2643*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis()) 2644*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(IncrementCounter(0)); 2645*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThat()) 2646*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(IncrementCounter(0)); 2647*481dde66SAndroid Build Coastguard Worker foo.DoThis(); // Returns 1. 2648*481dde66SAndroid Build Coastguard Worker foo.DoThis(); // Returns 2. 2649*481dde66SAndroid Build Coastguard Worker foo.DoThat(); // Returns 1 - DoThat() uses a different 2650*481dde66SAndroid Build Coastguard Worker // counter than DoThis()'s. 2651*481dde66SAndroid Build Coastguard Worker``` 2652*481dde66SAndroid Build Coastguard Worker 2653*481dde66SAndroid Build Coastguard Workerversus 2654*481dde66SAndroid Build Coastguard Worker 2655*481dde66SAndroid Build Coastguard Worker```cpp 2656*481dde66SAndroid Build Coastguard Workerusing ::testing::Action; 2657*481dde66SAndroid Build Coastguard Worker... 2658*481dde66SAndroid Build Coastguard Worker Action<int()> increment = IncrementCounter(0); 2659*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis()) 2660*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(increment); 2661*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThat()) 2662*481dde66SAndroid Build Coastguard Worker .WillRepeatedly(increment); 2663*481dde66SAndroid Build Coastguard Worker foo.DoThis(); // Returns 1. 2664*481dde66SAndroid Build Coastguard Worker foo.DoThis(); // Returns 2. 2665*481dde66SAndroid Build Coastguard Worker foo.DoThat(); // Returns 3 - the counter is shared. 2666*481dde66SAndroid Build Coastguard Worker``` 2667*481dde66SAndroid Build Coastguard Worker 2668*481dde66SAndroid Build Coastguard Worker### Testing Asynchronous Behavior 2669*481dde66SAndroid Build Coastguard Worker 2670*481dde66SAndroid Build Coastguard WorkerOne oft-encountered problem with gMock is that it can be hard to test 2671*481dde66SAndroid Build Coastguard Workerasynchronous behavior. Suppose you had a `EventQueue` class that you wanted to 2672*481dde66SAndroid Build Coastguard Workertest, and you created a separate `EventDispatcher` interface so that you could 2673*481dde66SAndroid Build Coastguard Workereasily mock it out. However, the implementation of the class fired all the 2674*481dde66SAndroid Build Coastguard Workerevents on a background thread, which made test timings difficult. You could just 2675*481dde66SAndroid Build Coastguard Workerinsert `sleep()` statements and hope for the best, but that makes your test 2676*481dde66SAndroid Build Coastguard Workerbehavior nondeterministic. A better way is to use gMock actions and 2677*481dde66SAndroid Build Coastguard Worker`Notification` objects to force your asynchronous test to behave synchronously. 2678*481dde66SAndroid Build Coastguard Worker 2679*481dde66SAndroid Build Coastguard Worker```cpp 2680*481dde66SAndroid Build Coastguard Workerclass MockEventDispatcher : public EventDispatcher { 2681*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, DispatchEvent, (int32), (override)); 2682*481dde66SAndroid Build Coastguard Worker}; 2683*481dde66SAndroid Build Coastguard Worker 2684*481dde66SAndroid Build Coastguard WorkerTEST(EventQueueTest, EnqueueEventTest) { 2685*481dde66SAndroid Build Coastguard Worker MockEventDispatcher mock_event_dispatcher; 2686*481dde66SAndroid Build Coastguard Worker EventQueue event_queue(&mock_event_dispatcher); 2687*481dde66SAndroid Build Coastguard Worker 2688*481dde66SAndroid Build Coastguard Worker const int32 kEventId = 321; 2689*481dde66SAndroid Build Coastguard Worker absl::Notification done; 2690*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_event_dispatcher, DispatchEvent(kEventId)) 2691*481dde66SAndroid Build Coastguard Worker .WillOnce([&done] { done.Notify(); }); 2692*481dde66SAndroid Build Coastguard Worker 2693*481dde66SAndroid Build Coastguard Worker event_queue.EnqueueEvent(kEventId); 2694*481dde66SAndroid Build Coastguard Worker done.WaitForNotification(); 2695*481dde66SAndroid Build Coastguard Worker} 2696*481dde66SAndroid Build Coastguard Worker``` 2697*481dde66SAndroid Build Coastguard Worker 2698*481dde66SAndroid Build Coastguard WorkerIn the example above, we set our normal gMock expectations, but then add an 2699*481dde66SAndroid Build Coastguard Workeradditional action to notify the `Notification` object. Now we can just call 2700*481dde66SAndroid Build Coastguard Worker`Notification::WaitForNotification()` in the main thread to wait for the 2701*481dde66SAndroid Build Coastguard Workerasynchronous call to finish. After that, our test suite is complete and we can 2702*481dde66SAndroid Build Coastguard Workersafely exit. 2703*481dde66SAndroid Build Coastguard Worker 2704*481dde66SAndroid Build Coastguard Worker{: .callout .note} 2705*481dde66SAndroid Build Coastguard WorkerNote: this example has a downside: namely, if the expectation is not satisfied, 2706*481dde66SAndroid Build Coastguard Workerour test will run forever. It will eventually time-out and fail, but it will 2707*481dde66SAndroid Build Coastguard Workertake longer and be slightly harder to debug. To alleviate this problem, you can 2708*481dde66SAndroid Build Coastguard Workeruse `WaitForNotificationWithTimeout(ms)` instead of `WaitForNotification()`. 2709*481dde66SAndroid Build Coastguard Worker 2710*481dde66SAndroid Build Coastguard Worker## Misc Recipes on Using gMock 2711*481dde66SAndroid Build Coastguard Worker 2712*481dde66SAndroid Build Coastguard Worker### Mocking Methods That Use Move-Only Types 2713*481dde66SAndroid Build Coastguard Worker 2714*481dde66SAndroid Build Coastguard WorkerC++11 introduced *move-only types*. A move-only-typed value can be moved from 2715*481dde66SAndroid Build Coastguard Workerone object to another, but cannot be copied. `std::unique_ptr<T>` is probably 2716*481dde66SAndroid Build Coastguard Workerthe most commonly used move-only type. 2717*481dde66SAndroid Build Coastguard Worker 2718*481dde66SAndroid Build Coastguard WorkerMocking a method that takes and/or returns move-only types presents some 2719*481dde66SAndroid Build Coastguard Workerchallenges, but nothing insurmountable. This recipe shows you how you can do it. 2720*481dde66SAndroid Build Coastguard WorkerNote that the support for move-only method arguments was only introduced to 2721*481dde66SAndroid Build Coastguard WorkergMock in April 2017; in older code, you may find more complex 2722*481dde66SAndroid Build Coastguard Worker[workarounds](#LegacyMoveOnly) for lack of this feature. 2723*481dde66SAndroid Build Coastguard Worker 2724*481dde66SAndroid Build Coastguard WorkerLet’s say we are working on a fictional project that lets one post and share 2725*481dde66SAndroid Build Coastguard Workersnippets called “buzzes”. Your code uses these types: 2726*481dde66SAndroid Build Coastguard Worker 2727*481dde66SAndroid Build Coastguard Worker```cpp 2728*481dde66SAndroid Build Coastguard Workerenum class AccessLevel { kInternal, kPublic }; 2729*481dde66SAndroid Build Coastguard Worker 2730*481dde66SAndroid Build Coastguard Workerclass Buzz { 2731*481dde66SAndroid Build Coastguard Worker public: 2732*481dde66SAndroid Build Coastguard Worker explicit Buzz(AccessLevel access) { ... } 2733*481dde66SAndroid Build Coastguard Worker ... 2734*481dde66SAndroid Build Coastguard Worker}; 2735*481dde66SAndroid Build Coastguard Worker 2736*481dde66SAndroid Build Coastguard Workerclass Buzzer { 2737*481dde66SAndroid Build Coastguard Worker public: 2738*481dde66SAndroid Build Coastguard Worker virtual ~Buzzer() {} 2739*481dde66SAndroid Build Coastguard Worker virtual std::unique_ptr<Buzz> MakeBuzz(StringPiece text) = 0; 2740*481dde66SAndroid Build Coastguard Worker virtual bool ShareBuzz(std::unique_ptr<Buzz> buzz, int64_t timestamp) = 0; 2741*481dde66SAndroid Build Coastguard Worker ... 2742*481dde66SAndroid Build Coastguard Worker}; 2743*481dde66SAndroid Build Coastguard Worker``` 2744*481dde66SAndroid Build Coastguard Worker 2745*481dde66SAndroid Build Coastguard WorkerA `Buzz` object represents a snippet being posted. A class that implements the 2746*481dde66SAndroid Build Coastguard Worker`Buzzer` interface is capable of creating and sharing `Buzz`es. Methods in 2747*481dde66SAndroid Build Coastguard Worker`Buzzer` may return a `unique_ptr<Buzz>` or take a `unique_ptr<Buzz>`. Now we 2748*481dde66SAndroid Build Coastguard Workerneed to mock `Buzzer` in our tests. 2749*481dde66SAndroid Build Coastguard Worker 2750*481dde66SAndroid Build Coastguard WorkerTo mock a method that accepts or returns move-only types, you just use the 2751*481dde66SAndroid Build Coastguard Workerfamiliar `MOCK_METHOD` syntax as usual: 2752*481dde66SAndroid Build Coastguard Worker 2753*481dde66SAndroid Build Coastguard Worker```cpp 2754*481dde66SAndroid Build Coastguard Workerclass MockBuzzer : public Buzzer { 2755*481dde66SAndroid Build Coastguard Worker public: 2756*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(std::unique_ptr<Buzz>, MakeBuzz, (StringPiece text), (override)); 2757*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, ShareBuzz, (std::unique_ptr<Buzz> buzz, int64_t timestamp), 2758*481dde66SAndroid Build Coastguard Worker (override)); 2759*481dde66SAndroid Build Coastguard Worker}; 2760*481dde66SAndroid Build Coastguard Worker``` 2761*481dde66SAndroid Build Coastguard Worker 2762*481dde66SAndroid Build Coastguard WorkerNow that we have the mock class defined, we can use it in tests. In the 2763*481dde66SAndroid Build Coastguard Workerfollowing code examples, we assume that we have defined a `MockBuzzer` object 2764*481dde66SAndroid Build Coastguard Workernamed `mock_buzzer_`: 2765*481dde66SAndroid Build Coastguard Worker 2766*481dde66SAndroid Build Coastguard Worker```cpp 2767*481dde66SAndroid Build Coastguard Worker MockBuzzer mock_buzzer_; 2768*481dde66SAndroid Build Coastguard Worker``` 2769*481dde66SAndroid Build Coastguard Worker 2770*481dde66SAndroid Build Coastguard WorkerFirst let’s see how we can set expectations on the `MakeBuzz()` method, which 2771*481dde66SAndroid Build Coastguard Workerreturns a `unique_ptr<Buzz>`. 2772*481dde66SAndroid Build Coastguard Worker 2773*481dde66SAndroid Build Coastguard WorkerAs usual, if you set an expectation without an action (i.e. the `.WillOnce()` or 2774*481dde66SAndroid Build Coastguard Worker`.WillRepeatedly()` clause), when that expectation fires, the default action for 2775*481dde66SAndroid Build Coastguard Workerthat method will be taken. Since `unique_ptr<>` has a default constructor that 2776*481dde66SAndroid Build Coastguard Workerreturns a null `unique_ptr`, that’s what you’ll get if you don’t specify an 2777*481dde66SAndroid Build Coastguard Workeraction: 2778*481dde66SAndroid Build Coastguard Worker 2779*481dde66SAndroid Build Coastguard Worker```cpp 2780*481dde66SAndroid Build Coastguard Workerusing ::testing::IsNull; 2781*481dde66SAndroid Build Coastguard Worker... 2782*481dde66SAndroid Build Coastguard Worker // Use the default action. 2783*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")); 2784*481dde66SAndroid Build Coastguard Worker 2785*481dde66SAndroid Build Coastguard Worker // Triggers the previous EXPECT_CALL. 2786*481dde66SAndroid Build Coastguard Worker EXPECT_THAT(mock_buzzer_.MakeBuzz("hello"), IsNull()); 2787*481dde66SAndroid Build Coastguard Worker``` 2788*481dde66SAndroid Build Coastguard Worker 2789*481dde66SAndroid Build Coastguard WorkerIf you are not happy with the default action, you can tweak it as usual; see 2790*481dde66SAndroid Build Coastguard Worker[Setting Default Actions](#OnCall). 2791*481dde66SAndroid Build Coastguard Worker 2792*481dde66SAndroid Build Coastguard WorkerIf you just need to return a move-only value, you can use it in combination with 2793*481dde66SAndroid Build Coastguard Worker`WillOnce`. For example: 2794*481dde66SAndroid Build Coastguard Worker 2795*481dde66SAndroid Build Coastguard Worker```cpp 2796*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")) 2797*481dde66SAndroid Build Coastguard Worker .WillOnce(Return(std::make_unique<Buzz>(AccessLevel::kInternal))); 2798*481dde66SAndroid Build Coastguard Worker EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("hello")); 2799*481dde66SAndroid Build Coastguard Worker``` 2800*481dde66SAndroid Build Coastguard Worker 2801*481dde66SAndroid Build Coastguard WorkerQuiz time! What do you think will happen if a `Return` action is performed more 2802*481dde66SAndroid Build Coastguard Workerthan once (e.g. you write `... .WillRepeatedly(Return(std::move(...)));`)? Come 2803*481dde66SAndroid Build Coastguard Workerthink of it, after the first time the action runs, the source value will be 2804*481dde66SAndroid Build Coastguard Workerconsumed (since it’s a move-only value), so the next time around, there’s no 2805*481dde66SAndroid Build Coastguard Workervalue to move from -- you’ll get a run-time error that `Return(std::move(...))` 2806*481dde66SAndroid Build Coastguard Workercan only be run once. 2807*481dde66SAndroid Build Coastguard Worker 2808*481dde66SAndroid Build Coastguard WorkerIf you need your mock method to do more than just moving a pre-defined value, 2809*481dde66SAndroid Build Coastguard Workerremember that you can always use a lambda or a callable object, which can do 2810*481dde66SAndroid Build Coastguard Workerpretty much anything you want: 2811*481dde66SAndroid Build Coastguard Worker 2812*481dde66SAndroid Build Coastguard Worker```cpp 2813*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_buzzer_, MakeBuzz("x")) 2814*481dde66SAndroid Build Coastguard Worker .WillRepeatedly([](StringPiece text) { 2815*481dde66SAndroid Build Coastguard Worker return std::make_unique<Buzz>(AccessLevel::kInternal); 2816*481dde66SAndroid Build Coastguard Worker }); 2817*481dde66SAndroid Build Coastguard Worker 2818*481dde66SAndroid Build Coastguard Worker EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x")); 2819*481dde66SAndroid Build Coastguard Worker EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x")); 2820*481dde66SAndroid Build Coastguard Worker``` 2821*481dde66SAndroid Build Coastguard Worker 2822*481dde66SAndroid Build Coastguard WorkerEvery time this `EXPECT_CALL` fires, a new `unique_ptr<Buzz>` will be created 2823*481dde66SAndroid Build Coastguard Workerand returned. You cannot do this with `Return(std::make_unique<...>(...))`. 2824*481dde66SAndroid Build Coastguard Worker 2825*481dde66SAndroid Build Coastguard WorkerThat covers returning move-only values; but how do we work with methods 2826*481dde66SAndroid Build Coastguard Workeraccepting move-only arguments? The answer is that they work normally, although 2827*481dde66SAndroid Build Coastguard Workersome actions will not compile when any of method's arguments are move-only. You 2828*481dde66SAndroid Build Coastguard Workercan always use `Return`, or a [lambda or functor](#FunctionsAsActions): 2829*481dde66SAndroid Build Coastguard Worker 2830*481dde66SAndroid Build Coastguard Worker```cpp 2831*481dde66SAndroid Build Coastguard Worker using ::testing::Unused; 2832*481dde66SAndroid Build Coastguard Worker 2833*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_buzzer_, ShareBuzz(NotNull(), _)).WillOnce(Return(true)); 2834*481dde66SAndroid Build Coastguard Worker EXPECT_TRUE(mock_buzzer_.ShareBuzz(std::make_unique<Buzz>(AccessLevel::kInternal)), 2835*481dde66SAndroid Build Coastguard Worker 0); 2836*481dde66SAndroid Build Coastguard Worker 2837*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_buzzer_, ShareBuzz(_, _)).WillOnce( 2838*481dde66SAndroid Build Coastguard Worker [](std::unique_ptr<Buzz> buzz, Unused) { return buzz != nullptr; }); 2839*481dde66SAndroid Build Coastguard Worker EXPECT_FALSE(mock_buzzer_.ShareBuzz(nullptr, 0)); 2840*481dde66SAndroid Build Coastguard Worker``` 2841*481dde66SAndroid Build Coastguard Worker 2842*481dde66SAndroid Build Coastguard WorkerMany built-in actions (`WithArgs`, `WithoutArgs`,`DeleteArg`, `SaveArg`, ...) 2843*481dde66SAndroid Build Coastguard Workercould in principle support move-only arguments, but the support for this is not 2844*481dde66SAndroid Build Coastguard Workerimplemented yet. If this is blocking you, please file a bug. 2845*481dde66SAndroid Build Coastguard Worker 2846*481dde66SAndroid Build Coastguard WorkerA few actions (e.g. `DoAll`) copy their arguments internally, so they can never 2847*481dde66SAndroid Build Coastguard Workerwork with non-copyable objects; you'll have to use functors instead. 2848*481dde66SAndroid Build Coastguard Worker 2849*481dde66SAndroid Build Coastguard Worker#### Legacy workarounds for move-only types {#LegacyMoveOnly} 2850*481dde66SAndroid Build Coastguard Worker 2851*481dde66SAndroid Build Coastguard WorkerSupport for move-only function arguments was only introduced to gMock in April 2852*481dde66SAndroid Build Coastguard Workerof 2017. In older code, you may encounter the following workaround for the lack 2853*481dde66SAndroid Build Coastguard Workerof this feature (it is no longer necessary - we're including it just for 2854*481dde66SAndroid Build Coastguard Workerreference): 2855*481dde66SAndroid Build Coastguard Worker 2856*481dde66SAndroid Build Coastguard Worker```cpp 2857*481dde66SAndroid Build Coastguard Workerclass MockBuzzer : public Buzzer { 2858*481dde66SAndroid Build Coastguard Worker public: 2859*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, DoShareBuzz, (Buzz* buzz, Time timestamp)); 2860*481dde66SAndroid Build Coastguard Worker bool ShareBuzz(std::unique_ptr<Buzz> buzz, Time timestamp) override { 2861*481dde66SAndroid Build Coastguard Worker return DoShareBuzz(buzz.get(), timestamp); 2862*481dde66SAndroid Build Coastguard Worker } 2863*481dde66SAndroid Build Coastguard Worker}; 2864*481dde66SAndroid Build Coastguard Worker``` 2865*481dde66SAndroid Build Coastguard Worker 2866*481dde66SAndroid Build Coastguard WorkerThe trick is to delegate the `ShareBuzz()` method to a mock method (let’s call 2867*481dde66SAndroid Build Coastguard Workerit `DoShareBuzz()`) that does not take move-only parameters. Then, instead of 2868*481dde66SAndroid Build Coastguard Workersetting expectations on `ShareBuzz()`, you set them on the `DoShareBuzz()` mock 2869*481dde66SAndroid Build Coastguard Workermethod: 2870*481dde66SAndroid Build Coastguard Worker 2871*481dde66SAndroid Build Coastguard Worker```cpp 2872*481dde66SAndroid Build Coastguard Worker MockBuzzer mock_buzzer_; 2873*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_buzzer_, DoShareBuzz(NotNull(), _)); 2874*481dde66SAndroid Build Coastguard Worker 2875*481dde66SAndroid Build Coastguard Worker // When one calls ShareBuzz() on the MockBuzzer like this, the call is 2876*481dde66SAndroid Build Coastguard Worker // forwarded to DoShareBuzz(), which is mocked. Therefore this statement 2877*481dde66SAndroid Build Coastguard Worker // will trigger the above EXPECT_CALL. 2878*481dde66SAndroid Build Coastguard Worker mock_buzzer_.ShareBuzz(std::make_unique<Buzz>(AccessLevel::kInternal), 0); 2879*481dde66SAndroid Build Coastguard Worker``` 2880*481dde66SAndroid Build Coastguard Worker 2881*481dde66SAndroid Build Coastguard Worker### Making the Compilation Faster 2882*481dde66SAndroid Build Coastguard Worker 2883*481dde66SAndroid Build Coastguard WorkerBelieve it or not, the *vast majority* of the time spent on compiling a mock 2884*481dde66SAndroid Build Coastguard Workerclass is in generating its constructor and destructor, as they perform 2885*481dde66SAndroid Build Coastguard Workernon-trivial tasks (e.g. verification of the expectations). What's more, mock 2886*481dde66SAndroid Build Coastguard Workermethods with different signatures have different types and thus their 2887*481dde66SAndroid Build Coastguard Workerconstructors/destructors need to be generated by the compiler separately. As a 2888*481dde66SAndroid Build Coastguard Workerresult, if you mock many different types of methods, compiling your mock class 2889*481dde66SAndroid Build Coastguard Workercan get really slow. 2890*481dde66SAndroid Build Coastguard Worker 2891*481dde66SAndroid Build Coastguard WorkerIf you are experiencing slow compilation, you can move the definition of your 2892*481dde66SAndroid Build Coastguard Workermock class' constructor and destructor out of the class body and into a `.cc` 2893*481dde66SAndroid Build Coastguard Workerfile. This way, even if you `#include` your mock class in N files, the compiler 2894*481dde66SAndroid Build Coastguard Workeronly needs to generate its constructor and destructor once, resulting in a much 2895*481dde66SAndroid Build Coastguard Workerfaster compilation. 2896*481dde66SAndroid Build Coastguard Worker 2897*481dde66SAndroid Build Coastguard WorkerLet's illustrate the idea using an example. Here's the definition of a mock 2898*481dde66SAndroid Build Coastguard Workerclass before applying this recipe: 2899*481dde66SAndroid Build Coastguard Worker 2900*481dde66SAndroid Build Coastguard Worker```cpp 2901*481dde66SAndroid Build Coastguard Worker// File mock_foo.h. 2902*481dde66SAndroid Build Coastguard Worker... 2903*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 2904*481dde66SAndroid Build Coastguard Worker public: 2905*481dde66SAndroid Build Coastguard Worker // Since we don't declare the constructor or the destructor, 2906*481dde66SAndroid Build Coastguard Worker // the compiler will generate them in every translation unit 2907*481dde66SAndroid Build Coastguard Worker // where this mock class is used. 2908*481dde66SAndroid Build Coastguard Worker 2909*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(int, DoThis, (), (override)); 2910*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, DoThat, (const char* str), (override)); 2911*481dde66SAndroid Build Coastguard Worker ... more mock methods ... 2912*481dde66SAndroid Build Coastguard Worker}; 2913*481dde66SAndroid Build Coastguard Worker``` 2914*481dde66SAndroid Build Coastguard Worker 2915*481dde66SAndroid Build Coastguard WorkerAfter the change, it would look like: 2916*481dde66SAndroid Build Coastguard Worker 2917*481dde66SAndroid Build Coastguard Worker```cpp 2918*481dde66SAndroid Build Coastguard Worker// File mock_foo.h. 2919*481dde66SAndroid Build Coastguard Worker... 2920*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 2921*481dde66SAndroid Build Coastguard Worker public: 2922*481dde66SAndroid Build Coastguard Worker // The constructor and destructor are declared, but not defined, here. 2923*481dde66SAndroid Build Coastguard Worker MockFoo(); 2924*481dde66SAndroid Build Coastguard Worker virtual ~MockFoo(); 2925*481dde66SAndroid Build Coastguard Worker 2926*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(int, DoThis, (), (override)); 2927*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(bool, DoThat, (const char* str), (override)); 2928*481dde66SAndroid Build Coastguard Worker ... more mock methods ... 2929*481dde66SAndroid Build Coastguard Worker}; 2930*481dde66SAndroid Build Coastguard Worker``` 2931*481dde66SAndroid Build Coastguard Worker 2932*481dde66SAndroid Build Coastguard Workerand 2933*481dde66SAndroid Build Coastguard Worker 2934*481dde66SAndroid Build Coastguard Worker```cpp 2935*481dde66SAndroid Build Coastguard Worker// File mock_foo.cc. 2936*481dde66SAndroid Build Coastguard Worker#include "path/to/mock_foo.h" 2937*481dde66SAndroid Build Coastguard Worker 2938*481dde66SAndroid Build Coastguard Worker// The definitions may appear trivial, but the functions actually do a 2939*481dde66SAndroid Build Coastguard Worker// lot of things through the constructors/destructors of the member 2940*481dde66SAndroid Build Coastguard Worker// variables used to implement the mock methods. 2941*481dde66SAndroid Build Coastguard WorkerMockFoo::MockFoo() {} 2942*481dde66SAndroid Build Coastguard WorkerMockFoo::~MockFoo() {} 2943*481dde66SAndroid Build Coastguard Worker``` 2944*481dde66SAndroid Build Coastguard Worker 2945*481dde66SAndroid Build Coastguard Worker### Forcing a Verification 2946*481dde66SAndroid Build Coastguard Worker 2947*481dde66SAndroid Build Coastguard WorkerWhen it's being destroyed, your friendly mock object will automatically verify 2948*481dde66SAndroid Build Coastguard Workerthat all expectations on it have been satisfied, and will generate googletest 2949*481dde66SAndroid Build Coastguard Workerfailures if not. This is convenient as it leaves you with one less thing to 2950*481dde66SAndroid Build Coastguard Workerworry about. That is, unless you are not sure if your mock object will be 2951*481dde66SAndroid Build Coastguard Workerdestroyed. 2952*481dde66SAndroid Build Coastguard Worker 2953*481dde66SAndroid Build Coastguard WorkerHow could it be that your mock object won't eventually be destroyed? Well, it 2954*481dde66SAndroid Build Coastguard Workermight be created on the heap and owned by the code you are testing. Suppose 2955*481dde66SAndroid Build Coastguard Workerthere's a bug in that code and it doesn't delete the mock object properly - you 2956*481dde66SAndroid Build Coastguard Workercould end up with a passing test when there's actually a bug. 2957*481dde66SAndroid Build Coastguard Worker 2958*481dde66SAndroid Build Coastguard WorkerUsing a heap checker is a good idea and can alleviate the concern, but its 2959*481dde66SAndroid Build Coastguard Workerimplementation is not 100% reliable. So, sometimes you do want to *force* gMock 2960*481dde66SAndroid Build Coastguard Workerto verify a mock object before it is (hopefully) destructed. You can do this 2961*481dde66SAndroid Build Coastguard Workerwith `Mock::VerifyAndClearExpectations(&mock_object)`: 2962*481dde66SAndroid Build Coastguard Worker 2963*481dde66SAndroid Build Coastguard Worker```cpp 2964*481dde66SAndroid Build Coastguard WorkerTEST(MyServerTest, ProcessesRequest) { 2965*481dde66SAndroid Build Coastguard Worker using ::testing::Mock; 2966*481dde66SAndroid Build Coastguard Worker 2967*481dde66SAndroid Build Coastguard Worker MockFoo* const foo = new MockFoo; 2968*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(*foo, ...)...; 2969*481dde66SAndroid Build Coastguard Worker // ... other expectations ... 2970*481dde66SAndroid Build Coastguard Worker 2971*481dde66SAndroid Build Coastguard Worker // server now owns foo. 2972*481dde66SAndroid Build Coastguard Worker MyServer server(foo); 2973*481dde66SAndroid Build Coastguard Worker server.ProcessRequest(...); 2974*481dde66SAndroid Build Coastguard Worker 2975*481dde66SAndroid Build Coastguard Worker // In case that server's destructor will forget to delete foo, 2976*481dde66SAndroid Build Coastguard Worker // this will verify the expectations anyway. 2977*481dde66SAndroid Build Coastguard Worker Mock::VerifyAndClearExpectations(foo); 2978*481dde66SAndroid Build Coastguard Worker} // server is destroyed when it goes out of scope here. 2979*481dde66SAndroid Build Coastguard Worker``` 2980*481dde66SAndroid Build Coastguard Worker 2981*481dde66SAndroid Build Coastguard Worker{: .callout .tip} 2982*481dde66SAndroid Build Coastguard Worker**Tip:** The `Mock::VerifyAndClearExpectations()` function returns a `bool` to 2983*481dde66SAndroid Build Coastguard Workerindicate whether the verification was successful (`true` for yes), so you can 2984*481dde66SAndroid Build Coastguard Workerwrap that function call inside a `ASSERT_TRUE()` if there is no point going 2985*481dde66SAndroid Build Coastguard Workerfurther when the verification has failed. 2986*481dde66SAndroid Build Coastguard Worker 2987*481dde66SAndroid Build Coastguard WorkerDo not set new expectations after verifying and clearing a mock after its use. 2988*481dde66SAndroid Build Coastguard WorkerSetting expectations after code that exercises the mock has undefined behavior. 2989*481dde66SAndroid Build Coastguard WorkerSee [Using Mocks in Tests](gmock_for_dummies.md#using-mocks-in-tests) for more 2990*481dde66SAndroid Build Coastguard Workerinformation. 2991*481dde66SAndroid Build Coastguard Worker 2992*481dde66SAndroid Build Coastguard Worker### Using Checkpoints {#UsingCheckPoints} 2993*481dde66SAndroid Build Coastguard Worker 2994*481dde66SAndroid Build Coastguard WorkerSometimes you might want to test a mock object's behavior in phases whose sizes 2995*481dde66SAndroid Build Coastguard Workerare each manageable, or you might want to set more detailed expectations about 2996*481dde66SAndroid Build Coastguard Workerwhich API calls invoke which mock functions. 2997*481dde66SAndroid Build Coastguard Worker 2998*481dde66SAndroid Build Coastguard WorkerA technique you can use is to put the expectations in a sequence and insert 2999*481dde66SAndroid Build Coastguard Workercalls to a dummy "checkpoint" function at specific places. Then you can verify 3000*481dde66SAndroid Build Coastguard Workerthat the mock function calls do happen at the right time. For example, if you 3001*481dde66SAndroid Build Coastguard Workerare exercising the code: 3002*481dde66SAndroid Build Coastguard Worker 3003*481dde66SAndroid Build Coastguard Worker```cpp 3004*481dde66SAndroid Build Coastguard Worker Foo(1); 3005*481dde66SAndroid Build Coastguard Worker Foo(2); 3006*481dde66SAndroid Build Coastguard Worker Foo(3); 3007*481dde66SAndroid Build Coastguard Worker``` 3008*481dde66SAndroid Build Coastguard Worker 3009*481dde66SAndroid Build Coastguard Workerand want to verify that `Foo(1)` and `Foo(3)` both invoke `mock.Bar("a")`, but 3010*481dde66SAndroid Build Coastguard Worker`Foo(2)` doesn't invoke anything, you can write: 3011*481dde66SAndroid Build Coastguard Worker 3012*481dde66SAndroid Build Coastguard Worker```cpp 3013*481dde66SAndroid Build Coastguard Workerusing ::testing::MockFunction; 3014*481dde66SAndroid Build Coastguard Worker 3015*481dde66SAndroid Build Coastguard WorkerTEST(FooTest, InvokesBarCorrectly) { 3016*481dde66SAndroid Build Coastguard Worker MyMock mock; 3017*481dde66SAndroid Build Coastguard Worker // Class MockFunction<F> has exactly one mock method. It is named 3018*481dde66SAndroid Build Coastguard Worker // Call() and has type F. 3019*481dde66SAndroid Build Coastguard Worker MockFunction<void(string check_point_name)> check; 3020*481dde66SAndroid Build Coastguard Worker { 3021*481dde66SAndroid Build Coastguard Worker InSequence s; 3022*481dde66SAndroid Build Coastguard Worker 3023*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Bar("a")); 3024*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(check, Call("1")); 3025*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(check, Call("2")); 3026*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Bar("a")); 3027*481dde66SAndroid Build Coastguard Worker } 3028*481dde66SAndroid Build Coastguard Worker Foo(1); 3029*481dde66SAndroid Build Coastguard Worker check.Call("1"); 3030*481dde66SAndroid Build Coastguard Worker Foo(2); 3031*481dde66SAndroid Build Coastguard Worker check.Call("2"); 3032*481dde66SAndroid Build Coastguard Worker Foo(3); 3033*481dde66SAndroid Build Coastguard Worker} 3034*481dde66SAndroid Build Coastguard Worker``` 3035*481dde66SAndroid Build Coastguard Worker 3036*481dde66SAndroid Build Coastguard WorkerThe expectation spec says that the first `Bar("a")` call must happen before 3037*481dde66SAndroid Build Coastguard Workercheckpoint "1", the second `Bar("a")` call must happen after checkpoint "2", and 3038*481dde66SAndroid Build Coastguard Workernothing should happen between the two checkpoints. The explicit checkpoints make 3039*481dde66SAndroid Build Coastguard Workerit clear which `Bar("a")` is called by which call to `Foo()`. 3040*481dde66SAndroid Build Coastguard Worker 3041*481dde66SAndroid Build Coastguard Worker### Mocking Destructors 3042*481dde66SAndroid Build Coastguard Worker 3043*481dde66SAndroid Build Coastguard WorkerSometimes you want to make sure a mock object is destructed at the right time, 3044*481dde66SAndroid Build Coastguard Workere.g. after `bar->A()` is called but before `bar->B()` is called. We already know 3045*481dde66SAndroid Build Coastguard Workerthat you can specify constraints on the [order](#OrderedCalls) of mock function 3046*481dde66SAndroid Build Coastguard Workercalls, so all we need to do is to mock the destructor of the mock function. 3047*481dde66SAndroid Build Coastguard Worker 3048*481dde66SAndroid Build Coastguard WorkerThis sounds simple, except for one problem: a destructor is a special function 3049*481dde66SAndroid Build Coastguard Workerwith special syntax and special semantics, and the `MOCK_METHOD` macro doesn't 3050*481dde66SAndroid Build Coastguard Workerwork for it: 3051*481dde66SAndroid Build Coastguard Worker 3052*481dde66SAndroid Build Coastguard Worker```cpp 3053*481dde66SAndroid Build Coastguard WorkerMOCK_METHOD(void, ~MockFoo, ()); // Won't compile! 3054*481dde66SAndroid Build Coastguard Worker``` 3055*481dde66SAndroid Build Coastguard Worker 3056*481dde66SAndroid Build Coastguard WorkerThe good news is that you can use a simple pattern to achieve the same effect. 3057*481dde66SAndroid Build Coastguard WorkerFirst, add a mock function `Die()` to your mock class and call it in the 3058*481dde66SAndroid Build Coastguard Workerdestructor, like this: 3059*481dde66SAndroid Build Coastguard Worker 3060*481dde66SAndroid Build Coastguard Worker```cpp 3061*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 3062*481dde66SAndroid Build Coastguard Worker ... 3063*481dde66SAndroid Build Coastguard Worker // Add the following two lines to the mock class. 3064*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, Die, ()); 3065*481dde66SAndroid Build Coastguard Worker ~MockFoo() override { Die(); } 3066*481dde66SAndroid Build Coastguard Worker}; 3067*481dde66SAndroid Build Coastguard Worker``` 3068*481dde66SAndroid Build Coastguard Worker 3069*481dde66SAndroid Build Coastguard Worker(If the name `Die()` clashes with an existing symbol, choose another name.) Now, 3070*481dde66SAndroid Build Coastguard Workerwe have translated the problem of testing when a `MockFoo` object dies to 3071*481dde66SAndroid Build Coastguard Workertesting when its `Die()` method is called: 3072*481dde66SAndroid Build Coastguard Worker 3073*481dde66SAndroid Build Coastguard Worker```cpp 3074*481dde66SAndroid Build Coastguard Worker MockFoo* foo = new MockFoo; 3075*481dde66SAndroid Build Coastguard Worker MockBar* bar = new MockBar; 3076*481dde66SAndroid Build Coastguard Worker ... 3077*481dde66SAndroid Build Coastguard Worker { 3078*481dde66SAndroid Build Coastguard Worker InSequence s; 3079*481dde66SAndroid Build Coastguard Worker 3080*481dde66SAndroid Build Coastguard Worker // Expects *foo to die after bar->A() and before bar->B(). 3081*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(*bar, A()); 3082*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(*foo, Die()); 3083*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(*bar, B()); 3084*481dde66SAndroid Build Coastguard Worker } 3085*481dde66SAndroid Build Coastguard Worker``` 3086*481dde66SAndroid Build Coastguard Worker 3087*481dde66SAndroid Build Coastguard WorkerAnd that's that. 3088*481dde66SAndroid Build Coastguard Worker 3089*481dde66SAndroid Build Coastguard Worker### Using gMock and Threads {#UsingThreads} 3090*481dde66SAndroid Build Coastguard Worker 3091*481dde66SAndroid Build Coastguard WorkerIn a **unit** test, it's best if you could isolate and test a piece of code in a 3092*481dde66SAndroid Build Coastguard Workersingle-threaded context. That avoids race conditions and dead locks, and makes 3093*481dde66SAndroid Build Coastguard Workerdebugging your test much easier. 3094*481dde66SAndroid Build Coastguard Worker 3095*481dde66SAndroid Build Coastguard WorkerYet most programs are multi-threaded, and sometimes to test something we need to 3096*481dde66SAndroid Build Coastguard Workerpound on it from more than one thread. gMock works for this purpose too. 3097*481dde66SAndroid Build Coastguard Worker 3098*481dde66SAndroid Build Coastguard WorkerRemember the steps for using a mock: 3099*481dde66SAndroid Build Coastguard Worker 3100*481dde66SAndroid Build Coastguard Worker1. Create a mock object `foo`. 3101*481dde66SAndroid Build Coastguard Worker2. Set its default actions and expectations using `ON_CALL()` and 3102*481dde66SAndroid Build Coastguard Worker `EXPECT_CALL()`. 3103*481dde66SAndroid Build Coastguard Worker3. The code under test calls methods of `foo`. 3104*481dde66SAndroid Build Coastguard Worker4. Optionally, verify and reset the mock. 3105*481dde66SAndroid Build Coastguard Worker5. Destroy the mock yourself, or let the code under test destroy it. The 3106*481dde66SAndroid Build Coastguard Worker destructor will automatically verify it. 3107*481dde66SAndroid Build Coastguard Worker 3108*481dde66SAndroid Build Coastguard WorkerIf you follow the following simple rules, your mocks and threads can live 3109*481dde66SAndroid Build Coastguard Workerhappily together: 3110*481dde66SAndroid Build Coastguard Worker 3111*481dde66SAndroid Build Coastguard Worker* Execute your *test code* (as opposed to the code being tested) in *one* 3112*481dde66SAndroid Build Coastguard Worker thread. This makes your test easy to follow. 3113*481dde66SAndroid Build Coastguard Worker* Obviously, you can do step #1 without locking. 3114*481dde66SAndroid Build Coastguard Worker* When doing step #2 and #5, make sure no other thread is accessing `foo`. 3115*481dde66SAndroid Build Coastguard Worker Obvious too, huh? 3116*481dde66SAndroid Build Coastguard Worker* #3 and #4 can be done either in one thread or in multiple threads - anyway 3117*481dde66SAndroid Build Coastguard Worker you want. gMock takes care of the locking, so you don't have to do any - 3118*481dde66SAndroid Build Coastguard Worker unless required by your test logic. 3119*481dde66SAndroid Build Coastguard Worker 3120*481dde66SAndroid Build Coastguard WorkerIf you violate the rules (for example, if you set expectations on a mock while 3121*481dde66SAndroid Build Coastguard Workeranother thread is calling its methods), you get undefined behavior. That's not 3122*481dde66SAndroid Build Coastguard Workerfun, so don't do it. 3123*481dde66SAndroid Build Coastguard Worker 3124*481dde66SAndroid Build Coastguard WorkergMock guarantees that the action for a mock function is done in the same thread 3125*481dde66SAndroid Build Coastguard Workerthat called the mock function. For example, in 3126*481dde66SAndroid Build Coastguard Worker 3127*481dde66SAndroid Build Coastguard Worker```cpp 3128*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo(1)) 3129*481dde66SAndroid Build Coastguard Worker .WillOnce(action1); 3130*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo(2)) 3131*481dde66SAndroid Build Coastguard Worker .WillOnce(action2); 3132*481dde66SAndroid Build Coastguard Worker``` 3133*481dde66SAndroid Build Coastguard Worker 3134*481dde66SAndroid Build Coastguard Workerif `Foo(1)` is called in thread 1 and `Foo(2)` is called in thread 2, gMock will 3135*481dde66SAndroid Build Coastguard Workerexecute `action1` in thread 1 and `action2` in thread 2. 3136*481dde66SAndroid Build Coastguard Worker 3137*481dde66SAndroid Build Coastguard WorkergMock does *not* impose a sequence on actions performed in different threads 3138*481dde66SAndroid Build Coastguard Worker(doing so may create deadlocks as the actions may need to cooperate). This means 3139*481dde66SAndroid Build Coastguard Workerthat the execution of `action1` and `action2` in the above example *may* 3140*481dde66SAndroid Build Coastguard Workerinterleave. If this is a problem, you should add proper synchronization logic to 3141*481dde66SAndroid Build Coastguard Worker`action1` and `action2` to make the test thread-safe. 3142*481dde66SAndroid Build Coastguard Worker 3143*481dde66SAndroid Build Coastguard WorkerAlso, remember that `DefaultValue<T>` is a global resource that potentially 3144*481dde66SAndroid Build Coastguard Workeraffects *all* living mock objects in your program. Naturally, you won't want to 3145*481dde66SAndroid Build Coastguard Workermess with it from multiple threads or when there still are mocks in action. 3146*481dde66SAndroid Build Coastguard Worker 3147*481dde66SAndroid Build Coastguard Worker### Controlling How Much Information gMock Prints 3148*481dde66SAndroid Build Coastguard Worker 3149*481dde66SAndroid Build Coastguard WorkerWhen gMock sees something that has the potential of being an error (e.g. a mock 3150*481dde66SAndroid Build Coastguard Workerfunction with no expectation is called, a.k.a. an uninteresting call, which is 3151*481dde66SAndroid Build Coastguard Workerallowed but perhaps you forgot to explicitly ban the call), it prints some 3152*481dde66SAndroid Build Coastguard Workerwarning messages, including the arguments of the function, the return value, and 3153*481dde66SAndroid Build Coastguard Workerthe stack trace. Hopefully this will remind you to take a look and see if there 3154*481dde66SAndroid Build Coastguard Workeris indeed a problem. 3155*481dde66SAndroid Build Coastguard Worker 3156*481dde66SAndroid Build Coastguard WorkerSometimes you are confident that your tests are correct and may not appreciate 3157*481dde66SAndroid Build Coastguard Workersuch friendly messages. Some other times, you are debugging your tests or 3158*481dde66SAndroid Build Coastguard Workerlearning about the behavior of the code you are testing, and wish you could 3159*481dde66SAndroid Build Coastguard Workerobserve every mock call that happens (including argument values, the return 3160*481dde66SAndroid Build Coastguard Workervalue, and the stack trace). Clearly, one size doesn't fit all. 3161*481dde66SAndroid Build Coastguard Worker 3162*481dde66SAndroid Build Coastguard WorkerYou can control how much gMock tells you using the `--gmock_verbose=LEVEL` 3163*481dde66SAndroid Build Coastguard Workercommand-line flag, where `LEVEL` is a string with three possible values: 3164*481dde66SAndroid Build Coastguard Worker 3165*481dde66SAndroid Build Coastguard Worker* `info`: gMock will print all informational messages, warnings, and errors 3166*481dde66SAndroid Build Coastguard Worker (most verbose). At this setting, gMock will also log any calls to the 3167*481dde66SAndroid Build Coastguard Worker `ON_CALL/EXPECT_CALL` macros. It will include a stack trace in 3168*481dde66SAndroid Build Coastguard Worker "uninteresting call" warnings. 3169*481dde66SAndroid Build Coastguard Worker* `warning`: gMock will print both warnings and errors (less verbose); it will 3170*481dde66SAndroid Build Coastguard Worker omit the stack traces in "uninteresting call" warnings. This is the default. 3171*481dde66SAndroid Build Coastguard Worker* `error`: gMock will print errors only (least verbose). 3172*481dde66SAndroid Build Coastguard Worker 3173*481dde66SAndroid Build Coastguard WorkerAlternatively, you can adjust the value of that flag from within your tests like 3174*481dde66SAndroid Build Coastguard Workerso: 3175*481dde66SAndroid Build Coastguard Worker 3176*481dde66SAndroid Build Coastguard Worker```cpp 3177*481dde66SAndroid Build Coastguard Worker ::testing::FLAGS_gmock_verbose = "error"; 3178*481dde66SAndroid Build Coastguard Worker``` 3179*481dde66SAndroid Build Coastguard Worker 3180*481dde66SAndroid Build Coastguard WorkerIf you find gMock printing too many stack frames with its informational or 3181*481dde66SAndroid Build Coastguard Workerwarning messages, remember that you can control their amount with the 3182*481dde66SAndroid Build Coastguard Worker`--gtest_stack_trace_depth=max_depth` flag. 3183*481dde66SAndroid Build Coastguard Worker 3184*481dde66SAndroid Build Coastguard WorkerNow, judiciously use the right flag to enable gMock serve you better! 3185*481dde66SAndroid Build Coastguard Worker 3186*481dde66SAndroid Build Coastguard Worker### Gaining Super Vision into Mock Calls 3187*481dde66SAndroid Build Coastguard Worker 3188*481dde66SAndroid Build Coastguard WorkerYou have a test using gMock. It fails: gMock tells you some expectations aren't 3189*481dde66SAndroid Build Coastguard Workersatisfied. However, you aren't sure why: Is there a typo somewhere in the 3190*481dde66SAndroid Build Coastguard Workermatchers? Did you mess up the order of the `EXPECT_CALL`s? Or is the code under 3191*481dde66SAndroid Build Coastguard Workertest doing something wrong? How can you find out the cause? 3192*481dde66SAndroid Build Coastguard Worker 3193*481dde66SAndroid Build Coastguard WorkerWon't it be nice if you have X-ray vision and can actually see the trace of all 3194*481dde66SAndroid Build Coastguard Worker`EXPECT_CALL`s and mock method calls as they are made? For each call, would you 3195*481dde66SAndroid Build Coastguard Workerlike to see its actual argument values and which `EXPECT_CALL` gMock thinks it 3196*481dde66SAndroid Build Coastguard Workermatches? If you still need some help to figure out who made these calls, how 3197*481dde66SAndroid Build Coastguard Workerabout being able to see the complete stack trace at each mock call? 3198*481dde66SAndroid Build Coastguard Worker 3199*481dde66SAndroid Build Coastguard WorkerYou can unlock this power by running your test with the `--gmock_verbose=info` 3200*481dde66SAndroid Build Coastguard Workerflag. For example, given the test program: 3201*481dde66SAndroid Build Coastguard Worker 3202*481dde66SAndroid Build Coastguard Worker```cpp 3203*481dde66SAndroid Build Coastguard Worker#include <gmock/gmock.h> 3204*481dde66SAndroid Build Coastguard Worker 3205*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 3206*481dde66SAndroid Build Coastguard Workerusing ::testing::HasSubstr; 3207*481dde66SAndroid Build Coastguard Workerusing ::testing::Return; 3208*481dde66SAndroid Build Coastguard Worker 3209*481dde66SAndroid Build Coastguard Workerclass MockFoo { 3210*481dde66SAndroid Build Coastguard Worker public: 3211*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(void, F, (const string& x, const string& y)); 3212*481dde66SAndroid Build Coastguard Worker}; 3213*481dde66SAndroid Build Coastguard Worker 3214*481dde66SAndroid Build Coastguard WorkerTEST(Foo, Bar) { 3215*481dde66SAndroid Build Coastguard Worker MockFoo mock; 3216*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, F(_, _)).WillRepeatedly(Return()); 3217*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, F("a", "b")); 3218*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, F("c", HasSubstr("d"))); 3219*481dde66SAndroid Build Coastguard Worker 3220*481dde66SAndroid Build Coastguard Worker mock.F("a", "good"); 3221*481dde66SAndroid Build Coastguard Worker mock.F("a", "b"); 3222*481dde66SAndroid Build Coastguard Worker} 3223*481dde66SAndroid Build Coastguard Worker``` 3224*481dde66SAndroid Build Coastguard Worker 3225*481dde66SAndroid Build Coastguard Workerif you run it with `--gmock_verbose=info`, you will see this output: 3226*481dde66SAndroid Build Coastguard Worker 3227*481dde66SAndroid Build Coastguard Worker```shell 3228*481dde66SAndroid Build Coastguard Worker[ RUN ] Foo.Bar 3229*481dde66SAndroid Build Coastguard Worker 3230*481dde66SAndroid Build Coastguard Workerfoo_test.cc:14: EXPECT_CALL(mock, F(_, _)) invoked 3231*481dde66SAndroid Build Coastguard WorkerStack trace: ... 3232*481dde66SAndroid Build Coastguard Worker 3233*481dde66SAndroid Build Coastguard Workerfoo_test.cc:15: EXPECT_CALL(mock, F("a", "b")) invoked 3234*481dde66SAndroid Build Coastguard WorkerStack trace: ... 3235*481dde66SAndroid Build Coastguard Worker 3236*481dde66SAndroid Build Coastguard Workerfoo_test.cc:16: EXPECT_CALL(mock, F("c", HasSubstr("d"))) invoked 3237*481dde66SAndroid Build Coastguard WorkerStack trace: ... 3238*481dde66SAndroid Build Coastguard Worker 3239*481dde66SAndroid Build Coastguard Workerfoo_test.cc:14: Mock function call matches EXPECT_CALL(mock, F(_, _))... 3240*481dde66SAndroid Build Coastguard Worker Function call: F(@0x7fff7c8dad40"a",@0x7fff7c8dad10"good") 3241*481dde66SAndroid Build Coastguard WorkerStack trace: ... 3242*481dde66SAndroid Build Coastguard Worker 3243*481dde66SAndroid Build Coastguard Workerfoo_test.cc:15: Mock function call matches EXPECT_CALL(mock, F("a", "b"))... 3244*481dde66SAndroid Build Coastguard Worker Function call: F(@0x7fff7c8dada0"a",@0x7fff7c8dad70"b") 3245*481dde66SAndroid Build Coastguard WorkerStack trace: ... 3246*481dde66SAndroid Build Coastguard Worker 3247*481dde66SAndroid Build Coastguard Workerfoo_test.cc:16: Failure 3248*481dde66SAndroid Build Coastguard WorkerActual function call count doesn't match EXPECT_CALL(mock, F("c", HasSubstr("d")))... 3249*481dde66SAndroid Build Coastguard Worker Expected: to be called once 3250*481dde66SAndroid Build Coastguard Worker Actual: never called - unsatisfied and active 3251*481dde66SAndroid Build Coastguard Worker[ FAILED ] Foo.Bar 3252*481dde66SAndroid Build Coastguard Worker``` 3253*481dde66SAndroid Build Coastguard Worker 3254*481dde66SAndroid Build Coastguard WorkerSuppose the bug is that the `"c"` in the third `EXPECT_CALL` is a typo and 3255*481dde66SAndroid Build Coastguard Workershould actually be `"a"`. With the above message, you should see that the actual 3256*481dde66SAndroid Build Coastguard Worker`F("a", "good")` call is matched by the first `EXPECT_CALL`, not the third as 3257*481dde66SAndroid Build Coastguard Workeryou thought. From that it should be obvious that the third `EXPECT_CALL` is 3258*481dde66SAndroid Build Coastguard Workerwritten wrong. Case solved. 3259*481dde66SAndroid Build Coastguard Worker 3260*481dde66SAndroid Build Coastguard WorkerIf you are interested in the mock call trace but not the stack traces, you can 3261*481dde66SAndroid Build Coastguard Workercombine `--gmock_verbose=info` with `--gtest_stack_trace_depth=0` on the test 3262*481dde66SAndroid Build Coastguard Workercommand line. 3263*481dde66SAndroid Build Coastguard Worker 3264*481dde66SAndroid Build Coastguard Worker### Running Tests in Emacs 3265*481dde66SAndroid Build Coastguard Worker 3266*481dde66SAndroid Build Coastguard WorkerIf you build and run your tests in Emacs using the `M-x google-compile` command 3267*481dde66SAndroid Build Coastguard Worker(as many googletest users do), the source file locations of gMock and googletest 3268*481dde66SAndroid Build Coastguard Workererrors will be highlighted. Just press `<Enter>` on one of them and you'll be 3269*481dde66SAndroid Build Coastguard Workertaken to the offending line. Or, you can just type `C-x`` to jump to the next 3270*481dde66SAndroid Build Coastguard Workererror. 3271*481dde66SAndroid Build Coastguard Worker 3272*481dde66SAndroid Build Coastguard WorkerTo make it even easier, you can add the following lines to your `~/.emacs` file: 3273*481dde66SAndroid Build Coastguard Worker 3274*481dde66SAndroid Build Coastguard Worker```text 3275*481dde66SAndroid Build Coastguard Worker(global-set-key "\M-m" 'google-compile) ; m is for make 3276*481dde66SAndroid Build Coastguard Worker(global-set-key [M-down] 'next-error) 3277*481dde66SAndroid Build Coastguard Worker(global-set-key [M-up] '(lambda () (interactive) (next-error -1))) 3278*481dde66SAndroid Build Coastguard Worker``` 3279*481dde66SAndroid Build Coastguard Worker 3280*481dde66SAndroid Build Coastguard WorkerThen you can type `M-m` to start a build (if you want to run the test as well, 3281*481dde66SAndroid Build Coastguard Workerjust make sure `foo_test.run` or `runtests` is in the build command you supply 3282*481dde66SAndroid Build Coastguard Workerafter typing `M-m`), or `M-up`/`M-down` to move back and forth between errors. 3283*481dde66SAndroid Build Coastguard Worker 3284*481dde66SAndroid Build Coastguard Worker## Extending gMock 3285*481dde66SAndroid Build Coastguard Worker 3286*481dde66SAndroid Build Coastguard Worker### Writing New Matchers Quickly {#NewMatchers} 3287*481dde66SAndroid Build Coastguard Worker 3288*481dde66SAndroid Build Coastguard Worker{: .callout .warning} 3289*481dde66SAndroid Build Coastguard WorkerWARNING: gMock does not guarantee when or how many times a matcher will be 3290*481dde66SAndroid Build Coastguard Workerinvoked. Therefore, all matchers must be functionally pure. See 3291*481dde66SAndroid Build Coastguard Worker[this section](#PureMatchers) for more details. 3292*481dde66SAndroid Build Coastguard Worker 3293*481dde66SAndroid Build Coastguard WorkerThe `MATCHER*` family of macros can be used to define custom matchers easily. 3294*481dde66SAndroid Build Coastguard WorkerThe syntax: 3295*481dde66SAndroid Build Coastguard Worker 3296*481dde66SAndroid Build Coastguard Worker```cpp 3297*481dde66SAndroid Build Coastguard WorkerMATCHER(name, description_string_expression) { statements; } 3298*481dde66SAndroid Build Coastguard Worker``` 3299*481dde66SAndroid Build Coastguard Worker 3300*481dde66SAndroid Build Coastguard Workerwill define a matcher with the given name that executes the statements, which 3301*481dde66SAndroid Build Coastguard Workermust return a `bool` to indicate if the match succeeds. Inside the statements, 3302*481dde66SAndroid Build Coastguard Workeryou can refer to the value being matched by `arg`, and refer to its type by 3303*481dde66SAndroid Build Coastguard Worker`arg_type`. 3304*481dde66SAndroid Build Coastguard Worker 3305*481dde66SAndroid Build Coastguard WorkerThe *description string* is a `string`-typed expression that documents what the 3306*481dde66SAndroid Build Coastguard Workermatcher does, and is used to generate the failure message when the match fails. 3307*481dde66SAndroid Build Coastguard WorkerIt can (and should) reference the special `bool` variable `negation`, and should 3308*481dde66SAndroid Build Coastguard Workerevaluate to the description of the matcher when `negation` is `false`, or that 3309*481dde66SAndroid Build Coastguard Workerof the matcher's negation when `negation` is `true`. 3310*481dde66SAndroid Build Coastguard Worker 3311*481dde66SAndroid Build Coastguard WorkerFor convenience, we allow the description string to be empty (`""`), in which 3312*481dde66SAndroid Build Coastguard Workercase gMock will use the sequence of words in the matcher name as the 3313*481dde66SAndroid Build Coastguard Workerdescription. 3314*481dde66SAndroid Build Coastguard Worker 3315*481dde66SAndroid Build Coastguard Worker#### Basic Example 3316*481dde66SAndroid Build Coastguard Worker 3317*481dde66SAndroid Build Coastguard Worker```cpp 3318*481dde66SAndroid Build Coastguard WorkerMATCHER(IsDivisibleBy7, "") { return (arg % 7) == 0; } 3319*481dde66SAndroid Build Coastguard Worker``` 3320*481dde66SAndroid Build Coastguard Worker 3321*481dde66SAndroid Build Coastguard Workerallows you to write 3322*481dde66SAndroid Build Coastguard Worker 3323*481dde66SAndroid Build Coastguard Worker```cpp 3324*481dde66SAndroid Build Coastguard Worker // Expects mock_foo.Bar(n) to be called where n is divisible by 7. 3325*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_foo, Bar(IsDivisibleBy7())); 3326*481dde66SAndroid Build Coastguard Worker``` 3327*481dde66SAndroid Build Coastguard Worker 3328*481dde66SAndroid Build Coastguard Workeror, 3329*481dde66SAndroid Build Coastguard Worker 3330*481dde66SAndroid Build Coastguard Worker```cpp 3331*481dde66SAndroid Build Coastguard Worker using ::testing::Not; 3332*481dde66SAndroid Build Coastguard Worker ... 3333*481dde66SAndroid Build Coastguard Worker // Verifies that a value is divisible by 7 and the other is not. 3334*481dde66SAndroid Build Coastguard Worker EXPECT_THAT(some_expression, IsDivisibleBy7()); 3335*481dde66SAndroid Build Coastguard Worker EXPECT_THAT(some_other_expression, Not(IsDivisibleBy7())); 3336*481dde66SAndroid Build Coastguard Worker``` 3337*481dde66SAndroid Build Coastguard Worker 3338*481dde66SAndroid Build Coastguard WorkerIf the above assertions fail, they will print something like: 3339*481dde66SAndroid Build Coastguard Worker 3340*481dde66SAndroid Build Coastguard Worker```shell 3341*481dde66SAndroid Build Coastguard Worker Value of: some_expression 3342*481dde66SAndroid Build Coastguard Worker Expected: is divisible by 7 3343*481dde66SAndroid Build Coastguard Worker Actual: 27 3344*481dde66SAndroid Build Coastguard Worker ... 3345*481dde66SAndroid Build Coastguard Worker Value of: some_other_expression 3346*481dde66SAndroid Build Coastguard Worker Expected: not (is divisible by 7) 3347*481dde66SAndroid Build Coastguard Worker Actual: 21 3348*481dde66SAndroid Build Coastguard Worker``` 3349*481dde66SAndroid Build Coastguard Worker 3350*481dde66SAndroid Build Coastguard Workerwhere the descriptions `"is divisible by 7"` and `"not (is divisible by 7)"` are 3351*481dde66SAndroid Build Coastguard Workerautomatically calculated from the matcher name `IsDivisibleBy7`. 3352*481dde66SAndroid Build Coastguard Worker 3353*481dde66SAndroid Build Coastguard Worker#### Adding Custom Failure Messages 3354*481dde66SAndroid Build Coastguard Worker 3355*481dde66SAndroid Build Coastguard WorkerAs you may have noticed, the auto-generated descriptions (especially those for 3356*481dde66SAndroid Build Coastguard Workerthe negation) may not be so great. You can always override them with a `string` 3357*481dde66SAndroid Build Coastguard Workerexpression of your own: 3358*481dde66SAndroid Build Coastguard Worker 3359*481dde66SAndroid Build Coastguard Worker```cpp 3360*481dde66SAndroid Build Coastguard WorkerMATCHER(IsDivisibleBy7, 3361*481dde66SAndroid Build Coastguard Worker absl::StrCat(negation ? "isn't" : "is", " divisible by 7")) { 3362*481dde66SAndroid Build Coastguard Worker return (arg % 7) == 0; 3363*481dde66SAndroid Build Coastguard Worker} 3364*481dde66SAndroid Build Coastguard Worker``` 3365*481dde66SAndroid Build Coastguard Worker 3366*481dde66SAndroid Build Coastguard WorkerOptionally, you can stream additional information to a hidden argument named 3367*481dde66SAndroid Build Coastguard Worker`result_listener` to explain the match result. For example, a better definition 3368*481dde66SAndroid Build Coastguard Workerof `IsDivisibleBy7` is: 3369*481dde66SAndroid Build Coastguard Worker 3370*481dde66SAndroid Build Coastguard Worker```cpp 3371*481dde66SAndroid Build Coastguard WorkerMATCHER(IsDivisibleBy7, "") { 3372*481dde66SAndroid Build Coastguard Worker if ((arg % 7) == 0) 3373*481dde66SAndroid Build Coastguard Worker return true; 3374*481dde66SAndroid Build Coastguard Worker 3375*481dde66SAndroid Build Coastguard Worker *result_listener << "the remainder is " << (arg % 7); 3376*481dde66SAndroid Build Coastguard Worker return false; 3377*481dde66SAndroid Build Coastguard Worker} 3378*481dde66SAndroid Build Coastguard Worker``` 3379*481dde66SAndroid Build Coastguard Worker 3380*481dde66SAndroid Build Coastguard WorkerWith this definition, the above assertion will give a better message: 3381*481dde66SAndroid Build Coastguard Worker 3382*481dde66SAndroid Build Coastguard Worker```shell 3383*481dde66SAndroid Build Coastguard Worker Value of: some_expression 3384*481dde66SAndroid Build Coastguard Worker Expected: is divisible by 7 3385*481dde66SAndroid Build Coastguard Worker Actual: 27 (the remainder is 6) 3386*481dde66SAndroid Build Coastguard Worker``` 3387*481dde66SAndroid Build Coastguard Worker 3388*481dde66SAndroid Build Coastguard Worker#### Using EXPECT_ Statements in Matchers 3389*481dde66SAndroid Build Coastguard Worker 3390*481dde66SAndroid Build Coastguard WorkerYou can also use `EXPECT_...` (and `ASSERT_...`) statements inside custom 3391*481dde66SAndroid Build Coastguard Workermatcher definitions. In many cases, this allows you to write your matcher more 3392*481dde66SAndroid Build Coastguard Workerconcisely while still providing an informative error message. For example: 3393*481dde66SAndroid Build Coastguard Worker 3394*481dde66SAndroid Build Coastguard Worker```cpp 3395*481dde66SAndroid Build Coastguard WorkerMATCHER(IsDivisibleBy7, "") { 3396*481dde66SAndroid Build Coastguard Worker const auto remainder = arg % 7; 3397*481dde66SAndroid Build Coastguard Worker EXPECT_EQ(remainder, 0); 3398*481dde66SAndroid Build Coastguard Worker return true; 3399*481dde66SAndroid Build Coastguard Worker} 3400*481dde66SAndroid Build Coastguard Worker``` 3401*481dde66SAndroid Build Coastguard Worker 3402*481dde66SAndroid Build Coastguard WorkerIf you write a test that includes the line `EXPECT_THAT(27, IsDivisibleBy7());`, 3403*481dde66SAndroid Build Coastguard Workeryou will get an error something like the following: 3404*481dde66SAndroid Build Coastguard Worker 3405*481dde66SAndroid Build Coastguard Worker```shell 3406*481dde66SAndroid Build Coastguard WorkerExpected equality of these values: 3407*481dde66SAndroid Build Coastguard Worker remainder 3408*481dde66SAndroid Build Coastguard Worker Which is: 6 3409*481dde66SAndroid Build Coastguard Worker 0 3410*481dde66SAndroid Build Coastguard Worker``` 3411*481dde66SAndroid Build Coastguard Worker 3412*481dde66SAndroid Build Coastguard Worker#### `MatchAndExplain` 3413*481dde66SAndroid Build Coastguard Worker 3414*481dde66SAndroid Build Coastguard WorkerYou should let `MatchAndExplain()` print *any additional information* that can 3415*481dde66SAndroid Build Coastguard Workerhelp a user understand the match result. Note that it should explain why the 3416*481dde66SAndroid Build Coastguard Workermatch succeeds in case of a success (unless it's obvious) - this is useful when 3417*481dde66SAndroid Build Coastguard Workerthe matcher is used inside `Not()`. There is no need to print the argument value 3418*481dde66SAndroid Build Coastguard Workeritself, as gMock already prints it for you. 3419*481dde66SAndroid Build Coastguard Worker 3420*481dde66SAndroid Build Coastguard Worker#### Argument Types 3421*481dde66SAndroid Build Coastguard Worker 3422*481dde66SAndroid Build Coastguard WorkerThe type of the value being matched (`arg_type`) is determined by the 3423*481dde66SAndroid Build Coastguard Workercontext in which you use the matcher and is supplied to you by the compiler, so 3424*481dde66SAndroid Build Coastguard Workeryou don't need to worry about declaring it (nor can you). This allows the 3425*481dde66SAndroid Build Coastguard Workermatcher to be polymorphic. For example, `IsDivisibleBy7()` can be used to match 3426*481dde66SAndroid Build Coastguard Workerany type where the value of `(arg % 7) == 0` can be implicitly converted to a 3427*481dde66SAndroid Build Coastguard Worker`bool`. In the `Bar(IsDivisibleBy7())` example above, if method `Bar()` takes an 3428*481dde66SAndroid Build Coastguard Worker`int`, `arg_type` will be `int`; if it takes an `unsigned long`, `arg_type` will 3429*481dde66SAndroid Build Coastguard Workerbe `unsigned long`; and so on. 3430*481dde66SAndroid Build Coastguard Worker 3431*481dde66SAndroid Build Coastguard Worker### Writing New Parameterized Matchers Quickly 3432*481dde66SAndroid Build Coastguard Worker 3433*481dde66SAndroid Build Coastguard WorkerSometimes you'll want to define a matcher that has parameters. For that you can 3434*481dde66SAndroid Build Coastguard Workeruse the macro: 3435*481dde66SAndroid Build Coastguard Worker 3436*481dde66SAndroid Build Coastguard Worker```cpp 3437*481dde66SAndroid Build Coastguard WorkerMATCHER_P(name, param_name, description_string) { statements; } 3438*481dde66SAndroid Build Coastguard Worker``` 3439*481dde66SAndroid Build Coastguard Worker 3440*481dde66SAndroid Build Coastguard Workerwhere the description string can be either `""` or a `string` expression that 3441*481dde66SAndroid Build Coastguard Workerreferences `negation` and `param_name`. 3442*481dde66SAndroid Build Coastguard Worker 3443*481dde66SAndroid Build Coastguard WorkerFor example: 3444*481dde66SAndroid Build Coastguard Worker 3445*481dde66SAndroid Build Coastguard Worker```cpp 3446*481dde66SAndroid Build Coastguard WorkerMATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } 3447*481dde66SAndroid Build Coastguard Worker``` 3448*481dde66SAndroid Build Coastguard Worker 3449*481dde66SAndroid Build Coastguard Workerwill allow you to write: 3450*481dde66SAndroid Build Coastguard Worker 3451*481dde66SAndroid Build Coastguard Worker```cpp 3452*481dde66SAndroid Build Coastguard Worker EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); 3453*481dde66SAndroid Build Coastguard Worker``` 3454*481dde66SAndroid Build Coastguard Worker 3455*481dde66SAndroid Build Coastguard Workerwhich may lead to this message (assuming `n` is 10): 3456*481dde66SAndroid Build Coastguard Worker 3457*481dde66SAndroid Build Coastguard Worker```shell 3458*481dde66SAndroid Build Coastguard Worker Value of: Blah("a") 3459*481dde66SAndroid Build Coastguard Worker Expected: has absolute value 10 3460*481dde66SAndroid Build Coastguard Worker Actual: -9 3461*481dde66SAndroid Build Coastguard Worker``` 3462*481dde66SAndroid Build Coastguard Worker 3463*481dde66SAndroid Build Coastguard WorkerNote that both the matcher description and its parameter are printed, making the 3464*481dde66SAndroid Build Coastguard Workermessage human-friendly. 3465*481dde66SAndroid Build Coastguard Worker 3466*481dde66SAndroid Build Coastguard WorkerIn the matcher definition body, you can write `foo_type` to reference the type 3467*481dde66SAndroid Build Coastguard Workerof a parameter named `foo`. For example, in the body of 3468*481dde66SAndroid Build Coastguard Worker`MATCHER_P(HasAbsoluteValue, value)` above, you can write `value_type` to refer 3469*481dde66SAndroid Build Coastguard Workerto the type of `value`. 3470*481dde66SAndroid Build Coastguard Worker 3471*481dde66SAndroid Build Coastguard WorkergMock also provides `MATCHER_P2`, `MATCHER_P3`, ..., up to `MATCHER_P10` to 3472*481dde66SAndroid Build Coastguard Workersupport multi-parameter matchers: 3473*481dde66SAndroid Build Coastguard Worker 3474*481dde66SAndroid Build Coastguard Worker```cpp 3475*481dde66SAndroid Build Coastguard WorkerMATCHER_Pk(name, param_1, ..., param_k, description_string) { statements; } 3476*481dde66SAndroid Build Coastguard Worker``` 3477*481dde66SAndroid Build Coastguard Worker 3478*481dde66SAndroid Build Coastguard WorkerPlease note that the custom description string is for a particular *instance* of 3479*481dde66SAndroid Build Coastguard Workerthe matcher, where the parameters have been bound to actual values. Therefore 3480*481dde66SAndroid Build Coastguard Workerusually you'll want the parameter values to be part of the description. gMock 3481*481dde66SAndroid Build Coastguard Workerlets you do that by referencing the matcher parameters in the description string 3482*481dde66SAndroid Build Coastguard Workerexpression. 3483*481dde66SAndroid Build Coastguard Worker 3484*481dde66SAndroid Build Coastguard WorkerFor example, 3485*481dde66SAndroid Build Coastguard Worker 3486*481dde66SAndroid Build Coastguard Worker```cpp 3487*481dde66SAndroid Build Coastguard Workerusing ::testing::PrintToString; 3488*481dde66SAndroid Build Coastguard WorkerMATCHER_P2(InClosedRange, low, hi, 3489*481dde66SAndroid Build Coastguard Worker absl::StrFormat("%s in range [%s, %s]", negation ? "isn't" : "is", 3490*481dde66SAndroid Build Coastguard Worker PrintToString(low), PrintToString(hi))) { 3491*481dde66SAndroid Build Coastguard Worker return low <= arg && arg <= hi; 3492*481dde66SAndroid Build Coastguard Worker} 3493*481dde66SAndroid Build Coastguard Worker... 3494*481dde66SAndroid Build Coastguard WorkerEXPECT_THAT(3, InClosedRange(4, 6)); 3495*481dde66SAndroid Build Coastguard Worker``` 3496*481dde66SAndroid Build Coastguard Worker 3497*481dde66SAndroid Build Coastguard Workerwould generate a failure that contains the message: 3498*481dde66SAndroid Build Coastguard Worker 3499*481dde66SAndroid Build Coastguard Worker```shell 3500*481dde66SAndroid Build Coastguard Worker Expected: is in range [4, 6] 3501*481dde66SAndroid Build Coastguard Worker``` 3502*481dde66SAndroid Build Coastguard Worker 3503*481dde66SAndroid Build Coastguard WorkerIf you specify `""` as the description, the failure message will contain the 3504*481dde66SAndroid Build Coastguard Workersequence of words in the matcher name followed by the parameter values printed 3505*481dde66SAndroid Build Coastguard Workeras a tuple. For example, 3506*481dde66SAndroid Build Coastguard Worker 3507*481dde66SAndroid Build Coastguard Worker```cpp 3508*481dde66SAndroid Build Coastguard Worker MATCHER_P2(InClosedRange, low, hi, "") { ... } 3509*481dde66SAndroid Build Coastguard Worker ... 3510*481dde66SAndroid Build Coastguard Worker EXPECT_THAT(3, InClosedRange(4, 6)); 3511*481dde66SAndroid Build Coastguard Worker``` 3512*481dde66SAndroid Build Coastguard Worker 3513*481dde66SAndroid Build Coastguard Workerwould generate a failure that contains the text: 3514*481dde66SAndroid Build Coastguard Worker 3515*481dde66SAndroid Build Coastguard Worker```shell 3516*481dde66SAndroid Build Coastguard Worker Expected: in closed range (4, 6) 3517*481dde66SAndroid Build Coastguard Worker``` 3518*481dde66SAndroid Build Coastguard Worker 3519*481dde66SAndroid Build Coastguard WorkerFor the purpose of typing, you can view 3520*481dde66SAndroid Build Coastguard Worker 3521*481dde66SAndroid Build Coastguard Worker```cpp 3522*481dde66SAndroid Build Coastguard WorkerMATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } 3523*481dde66SAndroid Build Coastguard Worker``` 3524*481dde66SAndroid Build Coastguard Worker 3525*481dde66SAndroid Build Coastguard Workeras shorthand for 3526*481dde66SAndroid Build Coastguard Worker 3527*481dde66SAndroid Build Coastguard Worker```cpp 3528*481dde66SAndroid Build Coastguard Workertemplate <typename p1_type, ..., typename pk_type> 3529*481dde66SAndroid Build Coastguard WorkerFooMatcherPk<p1_type, ..., pk_type> 3530*481dde66SAndroid Build Coastguard WorkerFoo(p1_type p1, ..., pk_type pk) { ... } 3531*481dde66SAndroid Build Coastguard Worker``` 3532*481dde66SAndroid Build Coastguard Worker 3533*481dde66SAndroid Build Coastguard WorkerWhen you write `Foo(v1, ..., vk)`, the compiler infers the types of the 3534*481dde66SAndroid Build Coastguard Workerparameters `v1`, ..., and `vk` for you. If you are not happy with the result of 3535*481dde66SAndroid Build Coastguard Workerthe type inference, you can specify the types by explicitly instantiating the 3536*481dde66SAndroid Build Coastguard Workertemplate, as in `Foo<long, bool>(5, false)`. As said earlier, you don't get to 3537*481dde66SAndroid Build Coastguard Worker(or need to) specify `arg_type` as that's determined by the context in which the 3538*481dde66SAndroid Build Coastguard Workermatcher is used. 3539*481dde66SAndroid Build Coastguard Worker 3540*481dde66SAndroid Build Coastguard WorkerYou can assign the result of expression `Foo(p1, ..., pk)` to a variable of type 3541*481dde66SAndroid Build Coastguard Worker`FooMatcherPk<p1_type, ..., pk_type>`. This can be useful when composing 3542*481dde66SAndroid Build Coastguard Workermatchers. Matchers that don't have a parameter or have only one parameter have 3543*481dde66SAndroid Build Coastguard Workerspecial types: you can assign `Foo()` to a `FooMatcher`-typed variable, and 3544*481dde66SAndroid Build Coastguard Workerassign `Foo(p)` to a `FooMatcherP<p_type>`-typed variable. 3545*481dde66SAndroid Build Coastguard Worker 3546*481dde66SAndroid Build Coastguard WorkerWhile you can instantiate a matcher template with reference types, passing the 3547*481dde66SAndroid Build Coastguard Workerparameters by pointer usually makes your code more readable. If, however, you 3548*481dde66SAndroid Build Coastguard Workerstill want to pass a parameter by reference, be aware that in the failure 3549*481dde66SAndroid Build Coastguard Workermessage generated by the matcher you will see the value of the referenced object 3550*481dde66SAndroid Build Coastguard Workerbut not its address. 3551*481dde66SAndroid Build Coastguard Worker 3552*481dde66SAndroid Build Coastguard WorkerYou can overload matchers with different numbers of parameters: 3553*481dde66SAndroid Build Coastguard Worker 3554*481dde66SAndroid Build Coastguard Worker```cpp 3555*481dde66SAndroid Build Coastguard WorkerMATCHER_P(Blah, a, description_string_1) { ... } 3556*481dde66SAndroid Build Coastguard WorkerMATCHER_P2(Blah, a, b, description_string_2) { ... } 3557*481dde66SAndroid Build Coastguard Worker``` 3558*481dde66SAndroid Build Coastguard Worker 3559*481dde66SAndroid Build Coastguard WorkerWhile it's tempting to always use the `MATCHER*` macros when defining a new 3560*481dde66SAndroid Build Coastguard Workermatcher, you should also consider implementing the matcher interface directly 3561*481dde66SAndroid Build Coastguard Workerinstead (see the recipes that follow), especially if you need to use the matcher 3562*481dde66SAndroid Build Coastguard Workera lot. While these approaches require more work, they give you more control on 3563*481dde66SAndroid Build Coastguard Workerthe types of the value being matched and the matcher parameters, which in 3564*481dde66SAndroid Build Coastguard Workergeneral leads to better compiler error messages that pay off in the long run. 3565*481dde66SAndroid Build Coastguard WorkerThey also allow overloading matchers based on parameter types (as opposed to 3566*481dde66SAndroid Build Coastguard Workerjust based on the number of parameters). 3567*481dde66SAndroid Build Coastguard Worker 3568*481dde66SAndroid Build Coastguard Worker### Writing New Monomorphic Matchers 3569*481dde66SAndroid Build Coastguard Worker 3570*481dde66SAndroid Build Coastguard WorkerA matcher of argument type `T` implements the matcher interface for `T` and does 3571*481dde66SAndroid Build Coastguard Workertwo things: it tests whether a value of type `T` matches the matcher, and can 3572*481dde66SAndroid Build Coastguard Workerdescribe what kind of values it matches. The latter ability is used for 3573*481dde66SAndroid Build Coastguard Workergenerating readable error messages when expectations are violated. 3574*481dde66SAndroid Build Coastguard Worker 3575*481dde66SAndroid Build Coastguard WorkerA matcher of `T` must declare a typedef like: 3576*481dde66SAndroid Build Coastguard Worker 3577*481dde66SAndroid Build Coastguard Worker```cpp 3578*481dde66SAndroid Build Coastguard Workerusing is_gtest_matcher = void; 3579*481dde66SAndroid Build Coastguard Worker``` 3580*481dde66SAndroid Build Coastguard Worker 3581*481dde66SAndroid Build Coastguard Workerand supports the following operations: 3582*481dde66SAndroid Build Coastguard Worker 3583*481dde66SAndroid Build Coastguard Worker```cpp 3584*481dde66SAndroid Build Coastguard Worker// Match a value and optionally explain into an ostream. 3585*481dde66SAndroid Build Coastguard Workerbool matched = matcher.MatchAndExplain(value, maybe_os); 3586*481dde66SAndroid Build Coastguard Worker// where `value` is of type `T` and 3587*481dde66SAndroid Build Coastguard Worker// `maybe_os` is of type `std::ostream*`, where it can be null if the caller 3588*481dde66SAndroid Build Coastguard Worker// is not interested in there textual explanation. 3589*481dde66SAndroid Build Coastguard Worker 3590*481dde66SAndroid Build Coastguard Workermatcher.DescribeTo(os); 3591*481dde66SAndroid Build Coastguard Workermatcher.DescribeNegationTo(os); 3592*481dde66SAndroid Build Coastguard Worker// where `os` is of type `std::ostream*`. 3593*481dde66SAndroid Build Coastguard Worker``` 3594*481dde66SAndroid Build Coastguard Worker 3595*481dde66SAndroid Build Coastguard WorkerIf you need a custom matcher but `Truly()` is not a good option (for example, 3596*481dde66SAndroid Build Coastguard Workeryou may not be happy with the way `Truly(predicate)` describes itself, or you 3597*481dde66SAndroid Build Coastguard Workermay want your matcher to be polymorphic as `Eq(value)` is), you can define a 3598*481dde66SAndroid Build Coastguard Workermatcher to do whatever you want in two steps: first implement the matcher 3599*481dde66SAndroid Build Coastguard Workerinterface, and then define a factory function to create a matcher instance. The 3600*481dde66SAndroid Build Coastguard Workersecond step is not strictly needed but it makes the syntax of using the matcher 3601*481dde66SAndroid Build Coastguard Workernicer. 3602*481dde66SAndroid Build Coastguard Worker 3603*481dde66SAndroid Build Coastguard WorkerFor example, you can define a matcher to test whether an `int` is divisible by 7 3604*481dde66SAndroid Build Coastguard Workerand then use it like this: 3605*481dde66SAndroid Build Coastguard Worker 3606*481dde66SAndroid Build Coastguard Worker```cpp 3607*481dde66SAndroid Build Coastguard Workerusing ::testing::Matcher; 3608*481dde66SAndroid Build Coastguard Worker 3609*481dde66SAndroid Build Coastguard Workerclass DivisibleBy7Matcher { 3610*481dde66SAndroid Build Coastguard Worker public: 3611*481dde66SAndroid Build Coastguard Worker using is_gtest_matcher = void; 3612*481dde66SAndroid Build Coastguard Worker 3613*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(int n, std::ostream*) const { 3614*481dde66SAndroid Build Coastguard Worker return (n % 7) == 0; 3615*481dde66SAndroid Build Coastguard Worker } 3616*481dde66SAndroid Build Coastguard Worker 3617*481dde66SAndroid Build Coastguard Worker void DescribeTo(std::ostream* os) const { 3618*481dde66SAndroid Build Coastguard Worker *os << "is divisible by 7"; 3619*481dde66SAndroid Build Coastguard Worker } 3620*481dde66SAndroid Build Coastguard Worker 3621*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(std::ostream* os) const { 3622*481dde66SAndroid Build Coastguard Worker *os << "is not divisible by 7"; 3623*481dde66SAndroid Build Coastguard Worker } 3624*481dde66SAndroid Build Coastguard Worker}; 3625*481dde66SAndroid Build Coastguard Worker 3626*481dde66SAndroid Build Coastguard WorkerMatcher<int> DivisibleBy7() { 3627*481dde66SAndroid Build Coastguard Worker return DivisibleBy7Matcher(); 3628*481dde66SAndroid Build Coastguard Worker} 3629*481dde66SAndroid Build Coastguard Worker 3630*481dde66SAndroid Build Coastguard Worker... 3631*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(DivisibleBy7())); 3632*481dde66SAndroid Build Coastguard Worker``` 3633*481dde66SAndroid Build Coastguard Worker 3634*481dde66SAndroid Build Coastguard WorkerYou may improve the matcher message by streaming additional information to the 3635*481dde66SAndroid Build Coastguard Worker`os` argument in `MatchAndExplain()`: 3636*481dde66SAndroid Build Coastguard Worker 3637*481dde66SAndroid Build Coastguard Worker```cpp 3638*481dde66SAndroid Build Coastguard Workerclass DivisibleBy7Matcher { 3639*481dde66SAndroid Build Coastguard Worker public: 3640*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(int n, std::ostream* os) const { 3641*481dde66SAndroid Build Coastguard Worker const int remainder = n % 7; 3642*481dde66SAndroid Build Coastguard Worker if (remainder != 0 && os != nullptr) { 3643*481dde66SAndroid Build Coastguard Worker *os << "the remainder is " << remainder; 3644*481dde66SAndroid Build Coastguard Worker } 3645*481dde66SAndroid Build Coastguard Worker return remainder == 0; 3646*481dde66SAndroid Build Coastguard Worker } 3647*481dde66SAndroid Build Coastguard Worker ... 3648*481dde66SAndroid Build Coastguard Worker}; 3649*481dde66SAndroid Build Coastguard Worker``` 3650*481dde66SAndroid Build Coastguard Worker 3651*481dde66SAndroid Build Coastguard WorkerThen, `EXPECT_THAT(x, DivisibleBy7());` may generate a message like this: 3652*481dde66SAndroid Build Coastguard Worker 3653*481dde66SAndroid Build Coastguard Worker```shell 3654*481dde66SAndroid Build Coastguard WorkerValue of: x 3655*481dde66SAndroid Build Coastguard WorkerExpected: is divisible by 7 3656*481dde66SAndroid Build Coastguard Worker Actual: 23 (the remainder is 2) 3657*481dde66SAndroid Build Coastguard Worker``` 3658*481dde66SAndroid Build Coastguard Worker 3659*481dde66SAndroid Build Coastguard Worker{: .callout .tip} 3660*481dde66SAndroid Build Coastguard WorkerTip: for convenience, `MatchAndExplain()` can take a `MatchResultListener*` 3661*481dde66SAndroid Build Coastguard Workerinstead of `std::ostream*`. 3662*481dde66SAndroid Build Coastguard Worker 3663*481dde66SAndroid Build Coastguard Worker### Writing New Polymorphic Matchers 3664*481dde66SAndroid Build Coastguard Worker 3665*481dde66SAndroid Build Coastguard WorkerExpanding what we learned above to *polymorphic* matchers is now just as simple 3666*481dde66SAndroid Build Coastguard Workeras adding templates in the right place. 3667*481dde66SAndroid Build Coastguard Worker 3668*481dde66SAndroid Build Coastguard Worker```cpp 3669*481dde66SAndroid Build Coastguard Worker 3670*481dde66SAndroid Build Coastguard Workerclass NotNullMatcher { 3671*481dde66SAndroid Build Coastguard Worker public: 3672*481dde66SAndroid Build Coastguard Worker using is_gtest_matcher = void; 3673*481dde66SAndroid Build Coastguard Worker 3674*481dde66SAndroid Build Coastguard Worker // To implement a polymorphic matcher, we just need to make MatchAndExplain a 3675*481dde66SAndroid Build Coastguard Worker // template on its first argument. 3676*481dde66SAndroid Build Coastguard Worker 3677*481dde66SAndroid Build Coastguard Worker // In this example, we want to use NotNull() with any pointer, so 3678*481dde66SAndroid Build Coastguard Worker // MatchAndExplain() accepts a pointer of any type as its first argument. 3679*481dde66SAndroid Build Coastguard Worker // In general, you can define MatchAndExplain() as an ordinary method or 3680*481dde66SAndroid Build Coastguard Worker // a method template, or even overload it. 3681*481dde66SAndroid Build Coastguard Worker template <typename T> 3682*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(T* p, std::ostream*) const { 3683*481dde66SAndroid Build Coastguard Worker return p != nullptr; 3684*481dde66SAndroid Build Coastguard Worker } 3685*481dde66SAndroid Build Coastguard Worker 3686*481dde66SAndroid Build Coastguard Worker // Describes the property of a value matching this matcher. 3687*481dde66SAndroid Build Coastguard Worker void DescribeTo(std::ostream* os) const { *os << "is not NULL"; } 3688*481dde66SAndroid Build Coastguard Worker 3689*481dde66SAndroid Build Coastguard Worker // Describes the property of a value NOT matching this matcher. 3690*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(std::ostream* os) const { *os << "is NULL"; } 3691*481dde66SAndroid Build Coastguard Worker}; 3692*481dde66SAndroid Build Coastguard Worker 3693*481dde66SAndroid Build Coastguard WorkerNotNullMatcher NotNull() { 3694*481dde66SAndroid Build Coastguard Worker return NotNullMatcher(); 3695*481dde66SAndroid Build Coastguard Worker} 3696*481dde66SAndroid Build Coastguard Worker 3697*481dde66SAndroid Build Coastguard Worker... 3698*481dde66SAndroid Build Coastguard Worker 3699*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(NotNull())); // The argument must be a non-NULL pointer. 3700*481dde66SAndroid Build Coastguard Worker``` 3701*481dde66SAndroid Build Coastguard Worker 3702*481dde66SAndroid Build Coastguard Worker### Legacy Matcher Implementation 3703*481dde66SAndroid Build Coastguard Worker 3704*481dde66SAndroid Build Coastguard WorkerDefining matchers used to be somewhat more complicated, in which it required 3705*481dde66SAndroid Build Coastguard Workerseveral supporting classes and virtual functions. To implement a matcher for 3706*481dde66SAndroid Build Coastguard Workertype `T` using the legacy API you have to derive from `MatcherInterface<T>` and 3707*481dde66SAndroid Build Coastguard Workercall `MakeMatcher` to construct the object. 3708*481dde66SAndroid Build Coastguard Worker 3709*481dde66SAndroid Build Coastguard WorkerThe interface looks like this: 3710*481dde66SAndroid Build Coastguard Worker 3711*481dde66SAndroid Build Coastguard Worker```cpp 3712*481dde66SAndroid Build Coastguard Workerclass MatchResultListener { 3713*481dde66SAndroid Build Coastguard Worker public: 3714*481dde66SAndroid Build Coastguard Worker ... 3715*481dde66SAndroid Build Coastguard Worker // Streams x to the underlying ostream; does nothing if the ostream 3716*481dde66SAndroid Build Coastguard Worker // is NULL. 3717*481dde66SAndroid Build Coastguard Worker template <typename T> 3718*481dde66SAndroid Build Coastguard Worker MatchResultListener& operator<<(const T& x); 3719*481dde66SAndroid Build Coastguard Worker 3720*481dde66SAndroid Build Coastguard Worker // Returns the underlying ostream. 3721*481dde66SAndroid Build Coastguard Worker std::ostream* stream(); 3722*481dde66SAndroid Build Coastguard Worker}; 3723*481dde66SAndroid Build Coastguard Worker 3724*481dde66SAndroid Build Coastguard Workertemplate <typename T> 3725*481dde66SAndroid Build Coastguard Workerclass MatcherInterface { 3726*481dde66SAndroid Build Coastguard Worker public: 3727*481dde66SAndroid Build Coastguard Worker virtual ~MatcherInterface(); 3728*481dde66SAndroid Build Coastguard Worker 3729*481dde66SAndroid Build Coastguard Worker // Returns true if and only if the matcher matches x; also explains the match 3730*481dde66SAndroid Build Coastguard Worker // result to 'listener'. 3731*481dde66SAndroid Build Coastguard Worker virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; 3732*481dde66SAndroid Build Coastguard Worker 3733*481dde66SAndroid Build Coastguard Worker // Describes this matcher to an ostream. 3734*481dde66SAndroid Build Coastguard Worker virtual void DescribeTo(std::ostream* os) const = 0; 3735*481dde66SAndroid Build Coastguard Worker 3736*481dde66SAndroid Build Coastguard Worker // Describes the negation of this matcher to an ostream. 3737*481dde66SAndroid Build Coastguard Worker virtual void DescribeNegationTo(std::ostream* os) const; 3738*481dde66SAndroid Build Coastguard Worker}; 3739*481dde66SAndroid Build Coastguard Worker``` 3740*481dde66SAndroid Build Coastguard Worker 3741*481dde66SAndroid Build Coastguard WorkerFortunately, most of the time you can define a polymorphic matcher easily with 3742*481dde66SAndroid Build Coastguard Workerthe help of `MakePolymorphicMatcher()`. Here's how you can define `NotNull()` as 3743*481dde66SAndroid Build Coastguard Workeran example: 3744*481dde66SAndroid Build Coastguard Worker 3745*481dde66SAndroid Build Coastguard Worker```cpp 3746*481dde66SAndroid Build Coastguard Workerusing ::testing::MakePolymorphicMatcher; 3747*481dde66SAndroid Build Coastguard Workerusing ::testing::MatchResultListener; 3748*481dde66SAndroid Build Coastguard Workerusing ::testing::PolymorphicMatcher; 3749*481dde66SAndroid Build Coastguard Worker 3750*481dde66SAndroid Build Coastguard Workerclass NotNullMatcher { 3751*481dde66SAndroid Build Coastguard Worker public: 3752*481dde66SAndroid Build Coastguard Worker // To implement a polymorphic matcher, first define a COPYABLE class 3753*481dde66SAndroid Build Coastguard Worker // that has three members MatchAndExplain(), DescribeTo(), and 3754*481dde66SAndroid Build Coastguard Worker // DescribeNegationTo(), like the following. 3755*481dde66SAndroid Build Coastguard Worker 3756*481dde66SAndroid Build Coastguard Worker // In this example, we want to use NotNull() with any pointer, so 3757*481dde66SAndroid Build Coastguard Worker // MatchAndExplain() accepts a pointer of any type as its first argument. 3758*481dde66SAndroid Build Coastguard Worker // In general, you can define MatchAndExplain() as an ordinary method or 3759*481dde66SAndroid Build Coastguard Worker // a method template, or even overload it. 3760*481dde66SAndroid Build Coastguard Worker template <typename T> 3761*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(T* p, 3762*481dde66SAndroid Build Coastguard Worker MatchResultListener* /* listener */) const { 3763*481dde66SAndroid Build Coastguard Worker return p != NULL; 3764*481dde66SAndroid Build Coastguard Worker } 3765*481dde66SAndroid Build Coastguard Worker 3766*481dde66SAndroid Build Coastguard Worker // Describes the property of a value matching this matcher. 3767*481dde66SAndroid Build Coastguard Worker void DescribeTo(std::ostream* os) const { *os << "is not NULL"; } 3768*481dde66SAndroid Build Coastguard Worker 3769*481dde66SAndroid Build Coastguard Worker // Describes the property of a value NOT matching this matcher. 3770*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(std::ostream* os) const { *os << "is NULL"; } 3771*481dde66SAndroid Build Coastguard Worker}; 3772*481dde66SAndroid Build Coastguard Worker 3773*481dde66SAndroid Build Coastguard Worker// To construct a polymorphic matcher, pass an instance of the class 3774*481dde66SAndroid Build Coastguard Worker// to MakePolymorphicMatcher(). Note the return type. 3775*481dde66SAndroid Build Coastguard WorkerPolymorphicMatcher<NotNullMatcher> NotNull() { 3776*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(NotNullMatcher()); 3777*481dde66SAndroid Build Coastguard Worker} 3778*481dde66SAndroid Build Coastguard Worker 3779*481dde66SAndroid Build Coastguard Worker... 3780*481dde66SAndroid Build Coastguard Worker 3781*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(NotNull())); // The argument must be a non-NULL pointer. 3782*481dde66SAndroid Build Coastguard Worker``` 3783*481dde66SAndroid Build Coastguard Worker 3784*481dde66SAndroid Build Coastguard Worker{: .callout .note} 3785*481dde66SAndroid Build Coastguard Worker**Note:** Your polymorphic matcher class does **not** need to inherit from 3786*481dde66SAndroid Build Coastguard Worker`MatcherInterface` or any other class, and its methods do **not** need to be 3787*481dde66SAndroid Build Coastguard Workervirtual. 3788*481dde66SAndroid Build Coastguard Worker 3789*481dde66SAndroid Build Coastguard WorkerLike in a monomorphic matcher, you may explain the match result by streaming 3790*481dde66SAndroid Build Coastguard Workeradditional information to the `listener` argument in `MatchAndExplain()`. 3791*481dde66SAndroid Build Coastguard Worker 3792*481dde66SAndroid Build Coastguard Worker### Writing New Cardinalities 3793*481dde66SAndroid Build Coastguard Worker 3794*481dde66SAndroid Build Coastguard WorkerA cardinality is used in `Times()` to tell gMock how many times you expect a 3795*481dde66SAndroid Build Coastguard Workercall to occur. It doesn't have to be exact. For example, you can say 3796*481dde66SAndroid Build Coastguard Worker`AtLeast(5)` or `Between(2, 4)`. 3797*481dde66SAndroid Build Coastguard Worker 3798*481dde66SAndroid Build Coastguard WorkerIf the [built-in set](gmock_cheat_sheet.md#CardinalityList) of cardinalities 3799*481dde66SAndroid Build Coastguard Workerdoesn't suit you, you are free to define your own by implementing the following 3800*481dde66SAndroid Build Coastguard Workerinterface (in namespace `testing`): 3801*481dde66SAndroid Build Coastguard Worker 3802*481dde66SAndroid Build Coastguard Worker```cpp 3803*481dde66SAndroid Build Coastguard Workerclass CardinalityInterface { 3804*481dde66SAndroid Build Coastguard Worker public: 3805*481dde66SAndroid Build Coastguard Worker virtual ~CardinalityInterface(); 3806*481dde66SAndroid Build Coastguard Worker 3807*481dde66SAndroid Build Coastguard Worker // Returns true if and only if call_count calls will satisfy this cardinality. 3808*481dde66SAndroid Build Coastguard Worker virtual bool IsSatisfiedByCallCount(int call_count) const = 0; 3809*481dde66SAndroid Build Coastguard Worker 3810*481dde66SAndroid Build Coastguard Worker // Returns true if and only if call_count calls will saturate this 3811*481dde66SAndroid Build Coastguard Worker // cardinality. 3812*481dde66SAndroid Build Coastguard Worker virtual bool IsSaturatedByCallCount(int call_count) const = 0; 3813*481dde66SAndroid Build Coastguard Worker 3814*481dde66SAndroid Build Coastguard Worker // Describes self to an ostream. 3815*481dde66SAndroid Build Coastguard Worker virtual void DescribeTo(std::ostream* os) const = 0; 3816*481dde66SAndroid Build Coastguard Worker}; 3817*481dde66SAndroid Build Coastguard Worker``` 3818*481dde66SAndroid Build Coastguard Worker 3819*481dde66SAndroid Build Coastguard WorkerFor example, to specify that a call must occur even number of times, you can 3820*481dde66SAndroid Build Coastguard Workerwrite 3821*481dde66SAndroid Build Coastguard Worker 3822*481dde66SAndroid Build Coastguard Worker```cpp 3823*481dde66SAndroid Build Coastguard Workerusing ::testing::Cardinality; 3824*481dde66SAndroid Build Coastguard Workerusing ::testing::CardinalityInterface; 3825*481dde66SAndroid Build Coastguard Workerusing ::testing::MakeCardinality; 3826*481dde66SAndroid Build Coastguard Worker 3827*481dde66SAndroid Build Coastguard Workerclass EvenNumberCardinality : public CardinalityInterface { 3828*481dde66SAndroid Build Coastguard Worker public: 3829*481dde66SAndroid Build Coastguard Worker bool IsSatisfiedByCallCount(int call_count) const override { 3830*481dde66SAndroid Build Coastguard Worker return (call_count % 2) == 0; 3831*481dde66SAndroid Build Coastguard Worker } 3832*481dde66SAndroid Build Coastguard Worker 3833*481dde66SAndroid Build Coastguard Worker bool IsSaturatedByCallCount(int call_count) const override { 3834*481dde66SAndroid Build Coastguard Worker return false; 3835*481dde66SAndroid Build Coastguard Worker } 3836*481dde66SAndroid Build Coastguard Worker 3837*481dde66SAndroid Build Coastguard Worker void DescribeTo(std::ostream* os) const { 3838*481dde66SAndroid Build Coastguard Worker *os << "called even number of times"; 3839*481dde66SAndroid Build Coastguard Worker } 3840*481dde66SAndroid Build Coastguard Worker}; 3841*481dde66SAndroid Build Coastguard Worker 3842*481dde66SAndroid Build Coastguard WorkerCardinality EvenNumber() { 3843*481dde66SAndroid Build Coastguard Worker return MakeCardinality(new EvenNumberCardinality); 3844*481dde66SAndroid Build Coastguard Worker} 3845*481dde66SAndroid Build Coastguard Worker 3846*481dde66SAndroid Build Coastguard Worker... 3847*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Bar(3)) 3848*481dde66SAndroid Build Coastguard Worker .Times(EvenNumber()); 3849*481dde66SAndroid Build Coastguard Worker``` 3850*481dde66SAndroid Build Coastguard Worker 3851*481dde66SAndroid Build Coastguard Worker### Writing New Actions {#QuickNewActions} 3852*481dde66SAndroid Build Coastguard Worker 3853*481dde66SAndroid Build Coastguard WorkerIf the built-in actions don't work for you, you can easily define your own one. 3854*481dde66SAndroid Build Coastguard WorkerAll you need is a call operator with a signature compatible with the mocked 3855*481dde66SAndroid Build Coastguard Workerfunction. So you can use a lambda: 3856*481dde66SAndroid Build Coastguard Worker 3857*481dde66SAndroid Build Coastguard Worker```cpp 3858*481dde66SAndroid Build Coastguard WorkerMockFunction<int(int)> mock; 3859*481dde66SAndroid Build Coastguard WorkerEXPECT_CALL(mock, Call).WillOnce([](const int input) { return input * 7; }); 3860*481dde66SAndroid Build Coastguard WorkerEXPECT_EQ(mock.AsStdFunction()(2), 14); 3861*481dde66SAndroid Build Coastguard Worker``` 3862*481dde66SAndroid Build Coastguard Worker 3863*481dde66SAndroid Build Coastguard WorkerOr a struct with a call operator (even a templated one): 3864*481dde66SAndroid Build Coastguard Worker 3865*481dde66SAndroid Build Coastguard Worker```cpp 3866*481dde66SAndroid Build Coastguard Workerstruct MultiplyBy { 3867*481dde66SAndroid Build Coastguard Worker template <typename T> 3868*481dde66SAndroid Build Coastguard Worker T operator()(T arg) { return arg * multiplier; } 3869*481dde66SAndroid Build Coastguard Worker 3870*481dde66SAndroid Build Coastguard Worker int multiplier; 3871*481dde66SAndroid Build Coastguard Worker}; 3872*481dde66SAndroid Build Coastguard Worker 3873*481dde66SAndroid Build Coastguard Worker// Then use: 3874*481dde66SAndroid Build Coastguard Worker// EXPECT_CALL(...).WillOnce(MultiplyBy{7}); 3875*481dde66SAndroid Build Coastguard Worker``` 3876*481dde66SAndroid Build Coastguard Worker 3877*481dde66SAndroid Build Coastguard WorkerIt's also fine for the callable to take no arguments, ignoring the arguments 3878*481dde66SAndroid Build Coastguard Workersupplied to the mock function: 3879*481dde66SAndroid Build Coastguard Worker 3880*481dde66SAndroid Build Coastguard Worker```cpp 3881*481dde66SAndroid Build Coastguard WorkerMockFunction<int(int)> mock; 3882*481dde66SAndroid Build Coastguard WorkerEXPECT_CALL(mock, Call).WillOnce([] { return 17; }); 3883*481dde66SAndroid Build Coastguard WorkerEXPECT_EQ(mock.AsStdFunction()(0), 17); 3884*481dde66SAndroid Build Coastguard Worker``` 3885*481dde66SAndroid Build Coastguard Worker 3886*481dde66SAndroid Build Coastguard WorkerWhen used with `WillOnce`, the callable can assume it will be called at most 3887*481dde66SAndroid Build Coastguard Workeronce and is allowed to be a move-only type: 3888*481dde66SAndroid Build Coastguard Worker 3889*481dde66SAndroid Build Coastguard Worker```cpp 3890*481dde66SAndroid Build Coastguard Worker// An action that contains move-only types and has an &&-qualified operator, 3891*481dde66SAndroid Build Coastguard Worker// demanding in the type system that it be called at most once. This can be 3892*481dde66SAndroid Build Coastguard Worker// used with WillOnce, but the compiler will reject it if handed to 3893*481dde66SAndroid Build Coastguard Worker// WillRepeatedly. 3894*481dde66SAndroid Build Coastguard Workerstruct MoveOnlyAction { 3895*481dde66SAndroid Build Coastguard Worker std::unique_ptr<int> move_only_state; 3896*481dde66SAndroid Build Coastguard Worker std::unique_ptr<int> operator()() && { return std::move(move_only_state); } 3897*481dde66SAndroid Build Coastguard Worker}; 3898*481dde66SAndroid Build Coastguard Worker 3899*481dde66SAndroid Build Coastguard WorkerMockFunction<std::unique_ptr<int>()> mock; 3900*481dde66SAndroid Build Coastguard WorkerEXPECT_CALL(mock, Call).WillOnce(MoveOnlyAction{std::make_unique<int>(17)}); 3901*481dde66SAndroid Build Coastguard WorkerEXPECT_THAT(mock.AsStdFunction()(), Pointee(Eq(17))); 3902*481dde66SAndroid Build Coastguard Worker``` 3903*481dde66SAndroid Build Coastguard Worker 3904*481dde66SAndroid Build Coastguard WorkerMore generally, to use with a mock function whose signature is `R(Args...)` the 3905*481dde66SAndroid Build Coastguard Workerobject can be anything convertible to `OnceAction<R(Args...)>` or 3906*481dde66SAndroid Build Coastguard Worker`Action<R(Args...)`>. The difference between the two is that `OnceAction` has 3907*481dde66SAndroid Build Coastguard Workerweaker requirements (`Action` requires a copy-constructible input that can be 3908*481dde66SAndroid Build Coastguard Workercalled repeatedly whereas `OnceAction` requires only move-constructible and 3909*481dde66SAndroid Build Coastguard Workersupports `&&`-qualified call operators), but can be used only with `WillOnce`. 3910*481dde66SAndroid Build Coastguard Worker`OnceAction` is typically relevant only when supporting move-only types or 3911*481dde66SAndroid Build Coastguard Workeractions that want a type-system guarantee that they will be called at most once. 3912*481dde66SAndroid Build Coastguard Worker 3913*481dde66SAndroid Build Coastguard WorkerTypically the `OnceAction` and `Action` templates need not be referenced 3914*481dde66SAndroid Build Coastguard Workerdirectly in your actions: a struct or class with a call operator is sufficient, 3915*481dde66SAndroid Build Coastguard Workeras in the examples above. But fancier polymorphic actions that need to know the 3916*481dde66SAndroid Build Coastguard Workerspecific return type of the mock function can define templated conversion 3917*481dde66SAndroid Build Coastguard Workeroperators to make that possible. See `gmock-actions.h` for examples. 3918*481dde66SAndroid Build Coastguard Worker 3919*481dde66SAndroid Build Coastguard Worker#### Legacy macro-based Actions 3920*481dde66SAndroid Build Coastguard Worker 3921*481dde66SAndroid Build Coastguard WorkerBefore C++11, the functor-based actions were not supported; the old way of 3922*481dde66SAndroid Build Coastguard Workerwriting actions was through a set of `ACTION*` macros. We suggest to avoid them 3923*481dde66SAndroid Build Coastguard Workerin new code; they hide a lot of logic behind the macro, potentially leading to 3924*481dde66SAndroid Build Coastguard Workerharder-to-understand compiler errors. Nevertheless, we cover them here for 3925*481dde66SAndroid Build Coastguard Workercompleteness. 3926*481dde66SAndroid Build Coastguard Worker 3927*481dde66SAndroid Build Coastguard WorkerBy writing 3928*481dde66SAndroid Build Coastguard Worker 3929*481dde66SAndroid Build Coastguard Worker```cpp 3930*481dde66SAndroid Build Coastguard WorkerACTION(name) { statements; } 3931*481dde66SAndroid Build Coastguard Worker``` 3932*481dde66SAndroid Build Coastguard Worker 3933*481dde66SAndroid Build Coastguard Workerin a namespace scope (i.e. not inside a class or function), you will define an 3934*481dde66SAndroid Build Coastguard Workeraction with the given name that executes the statements. The value returned by 3935*481dde66SAndroid Build Coastguard Worker`statements` will be used as the return value of the action. Inside the 3936*481dde66SAndroid Build Coastguard Workerstatements, you can refer to the K-th (0-based) argument of the mock function as 3937*481dde66SAndroid Build Coastguard Worker`argK`. For example: 3938*481dde66SAndroid Build Coastguard Worker 3939*481dde66SAndroid Build Coastguard Worker```cpp 3940*481dde66SAndroid Build Coastguard WorkerACTION(IncrementArg1) { return ++(*arg1); } 3941*481dde66SAndroid Build Coastguard Worker``` 3942*481dde66SAndroid Build Coastguard Worker 3943*481dde66SAndroid Build Coastguard Workerallows you to write 3944*481dde66SAndroid Build Coastguard Worker 3945*481dde66SAndroid Build Coastguard Worker```cpp 3946*481dde66SAndroid Build Coastguard Worker... WillOnce(IncrementArg1()); 3947*481dde66SAndroid Build Coastguard Worker``` 3948*481dde66SAndroid Build Coastguard Worker 3949*481dde66SAndroid Build Coastguard WorkerNote that you don't need to specify the types of the mock function arguments. 3950*481dde66SAndroid Build Coastguard WorkerRest assured that your code is type-safe though: you'll get a compiler error if 3951*481dde66SAndroid Build Coastguard Worker`*arg1` doesn't support the `++` operator, or if the type of `++(*arg1)` isn't 3952*481dde66SAndroid Build Coastguard Workercompatible with the mock function's return type. 3953*481dde66SAndroid Build Coastguard Worker 3954*481dde66SAndroid Build Coastguard WorkerAnother example: 3955*481dde66SAndroid Build Coastguard Worker 3956*481dde66SAndroid Build Coastguard Worker```cpp 3957*481dde66SAndroid Build Coastguard WorkerACTION(Foo) { 3958*481dde66SAndroid Build Coastguard Worker (*arg2)(5); 3959*481dde66SAndroid Build Coastguard Worker Blah(); 3960*481dde66SAndroid Build Coastguard Worker *arg1 = 0; 3961*481dde66SAndroid Build Coastguard Worker return arg0; 3962*481dde66SAndroid Build Coastguard Worker} 3963*481dde66SAndroid Build Coastguard Worker``` 3964*481dde66SAndroid Build Coastguard Worker 3965*481dde66SAndroid Build Coastguard Workerdefines an action `Foo()` that invokes argument #2 (a function pointer) with 5, 3966*481dde66SAndroid Build Coastguard Workercalls function `Blah()`, sets the value pointed to by argument #1 to 0, and 3967*481dde66SAndroid Build Coastguard Workerreturns argument #0. 3968*481dde66SAndroid Build Coastguard Worker 3969*481dde66SAndroid Build Coastguard WorkerFor more convenience and flexibility, you can also use the following pre-defined 3970*481dde66SAndroid Build Coastguard Workersymbols in the body of `ACTION`: 3971*481dde66SAndroid Build Coastguard Worker 3972*481dde66SAndroid Build Coastguard Worker`argK_type` | The type of the K-th (0-based) argument of the mock function 3973*481dde66SAndroid Build Coastguard Worker:-------------- | :----------------------------------------------------------- 3974*481dde66SAndroid Build Coastguard Worker`args` | All arguments of the mock function as a tuple 3975*481dde66SAndroid Build Coastguard Worker`args_type` | The type of all arguments of the mock function as a tuple 3976*481dde66SAndroid Build Coastguard Worker`return_type` | The return type of the mock function 3977*481dde66SAndroid Build Coastguard Worker`function_type` | The type of the mock function 3978*481dde66SAndroid Build Coastguard Worker 3979*481dde66SAndroid Build Coastguard WorkerFor example, when using an `ACTION` as a stub action for mock function: 3980*481dde66SAndroid Build Coastguard Worker 3981*481dde66SAndroid Build Coastguard Worker```cpp 3982*481dde66SAndroid Build Coastguard Workerint DoSomething(bool flag, int* ptr); 3983*481dde66SAndroid Build Coastguard Worker``` 3984*481dde66SAndroid Build Coastguard Worker 3985*481dde66SAndroid Build Coastguard Workerwe have: 3986*481dde66SAndroid Build Coastguard Worker 3987*481dde66SAndroid Build Coastguard WorkerPre-defined Symbol | Is Bound To 3988*481dde66SAndroid Build Coastguard Worker------------------ | --------------------------------- 3989*481dde66SAndroid Build Coastguard Worker`arg0` | the value of `flag` 3990*481dde66SAndroid Build Coastguard Worker`arg0_type` | the type `bool` 3991*481dde66SAndroid Build Coastguard Worker`arg1` | the value of `ptr` 3992*481dde66SAndroid Build Coastguard Worker`arg1_type` | the type `int*` 3993*481dde66SAndroid Build Coastguard Worker`args` | the tuple `(flag, ptr)` 3994*481dde66SAndroid Build Coastguard Worker`args_type` | the type `std::tuple<bool, int*>` 3995*481dde66SAndroid Build Coastguard Worker`return_type` | the type `int` 3996*481dde66SAndroid Build Coastguard Worker`function_type` | the type `int(bool, int*)` 3997*481dde66SAndroid Build Coastguard Worker 3998*481dde66SAndroid Build Coastguard Worker#### Legacy macro-based parameterized Actions 3999*481dde66SAndroid Build Coastguard Worker 4000*481dde66SAndroid Build Coastguard WorkerSometimes you'll want to parameterize an action you define. For that we have 4001*481dde66SAndroid Build Coastguard Workeranother macro 4002*481dde66SAndroid Build Coastguard Worker 4003*481dde66SAndroid Build Coastguard Worker```cpp 4004*481dde66SAndroid Build Coastguard WorkerACTION_P(name, param) { statements; } 4005*481dde66SAndroid Build Coastguard Worker``` 4006*481dde66SAndroid Build Coastguard Worker 4007*481dde66SAndroid Build Coastguard WorkerFor example, 4008*481dde66SAndroid Build Coastguard Worker 4009*481dde66SAndroid Build Coastguard Worker```cpp 4010*481dde66SAndroid Build Coastguard WorkerACTION_P(Add, n) { return arg0 + n; } 4011*481dde66SAndroid Build Coastguard Worker``` 4012*481dde66SAndroid Build Coastguard Worker 4013*481dde66SAndroid Build Coastguard Workerwill allow you to write 4014*481dde66SAndroid Build Coastguard Worker 4015*481dde66SAndroid Build Coastguard Worker```cpp 4016*481dde66SAndroid Build Coastguard Worker// Returns argument #0 + 5. 4017*481dde66SAndroid Build Coastguard Worker... WillOnce(Add(5)); 4018*481dde66SAndroid Build Coastguard Worker``` 4019*481dde66SAndroid Build Coastguard Worker 4020*481dde66SAndroid Build Coastguard WorkerFor convenience, we use the term *arguments* for the values used to invoke the 4021*481dde66SAndroid Build Coastguard Workermock function, and the term *parameters* for the values used to instantiate an 4022*481dde66SAndroid Build Coastguard Workeraction. 4023*481dde66SAndroid Build Coastguard Worker 4024*481dde66SAndroid Build Coastguard WorkerNote that you don't need to provide the type of the parameter either. Suppose 4025*481dde66SAndroid Build Coastguard Workerthe parameter is named `param`, you can also use the gMock-defined symbol 4026*481dde66SAndroid Build Coastguard Worker`param_type` to refer to the type of the parameter as inferred by the compiler. 4027*481dde66SAndroid Build Coastguard WorkerFor example, in the body of `ACTION_P(Add, n)` above, you can write `n_type` for 4028*481dde66SAndroid Build Coastguard Workerthe type of `n`. 4029*481dde66SAndroid Build Coastguard Worker 4030*481dde66SAndroid Build Coastguard WorkergMock also provides `ACTION_P2`, `ACTION_P3`, and etc to support multi-parameter 4031*481dde66SAndroid Build Coastguard Workeractions. For example, 4032*481dde66SAndroid Build Coastguard Worker 4033*481dde66SAndroid Build Coastguard Worker```cpp 4034*481dde66SAndroid Build Coastguard WorkerACTION_P2(ReturnDistanceTo, x, y) { 4035*481dde66SAndroid Build Coastguard Worker double dx = arg0 - x; 4036*481dde66SAndroid Build Coastguard Worker double dy = arg1 - y; 4037*481dde66SAndroid Build Coastguard Worker return sqrt(dx*dx + dy*dy); 4038*481dde66SAndroid Build Coastguard Worker} 4039*481dde66SAndroid Build Coastguard Worker``` 4040*481dde66SAndroid Build Coastguard Worker 4041*481dde66SAndroid Build Coastguard Workerlets you write 4042*481dde66SAndroid Build Coastguard Worker 4043*481dde66SAndroid Build Coastguard Worker```cpp 4044*481dde66SAndroid Build Coastguard Worker... WillOnce(ReturnDistanceTo(5.0, 26.5)); 4045*481dde66SAndroid Build Coastguard Worker``` 4046*481dde66SAndroid Build Coastguard Worker 4047*481dde66SAndroid Build Coastguard WorkerYou can view `ACTION` as a degenerated parameterized action where the number of 4048*481dde66SAndroid Build Coastguard Workerparameters is 0. 4049*481dde66SAndroid Build Coastguard Worker 4050*481dde66SAndroid Build Coastguard WorkerYou can also easily define actions overloaded on the number of parameters: 4051*481dde66SAndroid Build Coastguard Worker 4052*481dde66SAndroid Build Coastguard Worker```cpp 4053*481dde66SAndroid Build Coastguard WorkerACTION_P(Plus, a) { ... } 4054*481dde66SAndroid Build Coastguard WorkerACTION_P2(Plus, a, b) { ... } 4055*481dde66SAndroid Build Coastguard Worker``` 4056*481dde66SAndroid Build Coastguard Worker 4057*481dde66SAndroid Build Coastguard Worker### Restricting the Type of an Argument or Parameter in an ACTION 4058*481dde66SAndroid Build Coastguard Worker 4059*481dde66SAndroid Build Coastguard WorkerFor maximum brevity and reusability, the `ACTION*` macros don't ask you to 4060*481dde66SAndroid Build Coastguard Workerprovide the types of the mock function arguments and the action parameters. 4061*481dde66SAndroid Build Coastguard WorkerInstead, we let the compiler infer the types for us. 4062*481dde66SAndroid Build Coastguard Worker 4063*481dde66SAndroid Build Coastguard WorkerSometimes, however, we may want to be more explicit about the types. There are 4064*481dde66SAndroid Build Coastguard Workerseveral tricks to do that. For example: 4065*481dde66SAndroid Build Coastguard Worker 4066*481dde66SAndroid Build Coastguard Worker```cpp 4067*481dde66SAndroid Build Coastguard WorkerACTION(Foo) { 4068*481dde66SAndroid Build Coastguard Worker // Makes sure arg0 can be converted to int. 4069*481dde66SAndroid Build Coastguard Worker int n = arg0; 4070*481dde66SAndroid Build Coastguard Worker ... use n instead of arg0 here ... 4071*481dde66SAndroid Build Coastguard Worker} 4072*481dde66SAndroid Build Coastguard Worker 4073*481dde66SAndroid Build Coastguard WorkerACTION_P(Bar, param) { 4074*481dde66SAndroid Build Coastguard Worker // Makes sure the type of arg1 is const char*. 4075*481dde66SAndroid Build Coastguard Worker ::testing::StaticAssertTypeEq<const char*, arg1_type>(); 4076*481dde66SAndroid Build Coastguard Worker 4077*481dde66SAndroid Build Coastguard Worker // Makes sure param can be converted to bool. 4078*481dde66SAndroid Build Coastguard Worker bool flag = param; 4079*481dde66SAndroid Build Coastguard Worker} 4080*481dde66SAndroid Build Coastguard Worker``` 4081*481dde66SAndroid Build Coastguard Worker 4082*481dde66SAndroid Build Coastguard Workerwhere `StaticAssertTypeEq` is a compile-time assertion in googletest that 4083*481dde66SAndroid Build Coastguard Workerverifies two types are the same. 4084*481dde66SAndroid Build Coastguard Worker 4085*481dde66SAndroid Build Coastguard Worker### Writing New Action Templates Quickly 4086*481dde66SAndroid Build Coastguard Worker 4087*481dde66SAndroid Build Coastguard WorkerSometimes you want to give an action explicit template parameters that cannot be 4088*481dde66SAndroid Build Coastguard Workerinferred from its value parameters. `ACTION_TEMPLATE()` supports that and can be 4089*481dde66SAndroid Build Coastguard Workerviewed as an extension to `ACTION()` and `ACTION_P*()`. 4090*481dde66SAndroid Build Coastguard Worker 4091*481dde66SAndroid Build Coastguard WorkerThe syntax: 4092*481dde66SAndroid Build Coastguard Worker 4093*481dde66SAndroid Build Coastguard Worker```cpp 4094*481dde66SAndroid Build Coastguard WorkerACTION_TEMPLATE(ActionName, 4095*481dde66SAndroid Build Coastguard Worker HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), 4096*481dde66SAndroid Build Coastguard Worker AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } 4097*481dde66SAndroid Build Coastguard Worker``` 4098*481dde66SAndroid Build Coastguard Worker 4099*481dde66SAndroid Build Coastguard Workerdefines an action template that takes *m* explicit template parameters and *n* 4100*481dde66SAndroid Build Coastguard Workervalue parameters, where *m* is in [1, 10] and *n* is in [0, 10]. `name_i` is the 4101*481dde66SAndroid Build Coastguard Workername of the *i*-th template parameter, and `kind_i` specifies whether it's a 4102*481dde66SAndroid Build Coastguard Worker`typename`, an integral constant, or a template. `p_i` is the name of the *i*-th 4103*481dde66SAndroid Build Coastguard Workervalue parameter. 4104*481dde66SAndroid Build Coastguard Worker 4105*481dde66SAndroid Build Coastguard WorkerExample: 4106*481dde66SAndroid Build Coastguard Worker 4107*481dde66SAndroid Build Coastguard Worker```cpp 4108*481dde66SAndroid Build Coastguard Worker// DuplicateArg<k, T>(output) converts the k-th argument of the mock 4109*481dde66SAndroid Build Coastguard Worker// function to type T and copies it to *output. 4110*481dde66SAndroid Build Coastguard WorkerACTION_TEMPLATE(DuplicateArg, 4111*481dde66SAndroid Build Coastguard Worker // Note the comma between int and k: 4112*481dde66SAndroid Build Coastguard Worker HAS_2_TEMPLATE_PARAMS(int, k, typename, T), 4113*481dde66SAndroid Build Coastguard Worker AND_1_VALUE_PARAMS(output)) { 4114*481dde66SAndroid Build Coastguard Worker *output = T(std::get<k>(args)); 4115*481dde66SAndroid Build Coastguard Worker} 4116*481dde66SAndroid Build Coastguard Worker``` 4117*481dde66SAndroid Build Coastguard Worker 4118*481dde66SAndroid Build Coastguard WorkerTo create an instance of an action template, write: 4119*481dde66SAndroid Build Coastguard Worker 4120*481dde66SAndroid Build Coastguard Worker```cpp 4121*481dde66SAndroid Build Coastguard WorkerActionName<t1, ..., t_m>(v1, ..., v_n) 4122*481dde66SAndroid Build Coastguard Worker``` 4123*481dde66SAndroid Build Coastguard Worker 4124*481dde66SAndroid Build Coastguard Workerwhere the `t`s are the template arguments and the `v`s are the value arguments. 4125*481dde66SAndroid Build Coastguard WorkerThe value argument types are inferred by the compiler. For example: 4126*481dde66SAndroid Build Coastguard Worker 4127*481dde66SAndroid Build Coastguard Worker```cpp 4128*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 4129*481dde66SAndroid Build Coastguard Worker... 4130*481dde66SAndroid Build Coastguard Worker int n; 4131*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock, Foo).WillOnce(DuplicateArg<1, unsigned char>(&n)); 4132*481dde66SAndroid Build Coastguard Worker``` 4133*481dde66SAndroid Build Coastguard Worker 4134*481dde66SAndroid Build Coastguard WorkerIf you want to explicitly specify the value argument types, you can provide 4135*481dde66SAndroid Build Coastguard Workeradditional template arguments: 4136*481dde66SAndroid Build Coastguard Worker 4137*481dde66SAndroid Build Coastguard Worker```cpp 4138*481dde66SAndroid Build Coastguard WorkerActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n) 4139*481dde66SAndroid Build Coastguard Worker``` 4140*481dde66SAndroid Build Coastguard Worker 4141*481dde66SAndroid Build Coastguard Workerwhere `u_i` is the desired type of `v_i`. 4142*481dde66SAndroid Build Coastguard Worker 4143*481dde66SAndroid Build Coastguard Worker`ACTION_TEMPLATE` and `ACTION`/`ACTION_P*` can be overloaded on the number of 4144*481dde66SAndroid Build Coastguard Workervalue parameters, but not on the number of template parameters. Without the 4145*481dde66SAndroid Build Coastguard Workerrestriction, the meaning of the following is unclear: 4146*481dde66SAndroid Build Coastguard Worker 4147*481dde66SAndroid Build Coastguard Worker```cpp 4148*481dde66SAndroid Build Coastguard Worker OverloadedAction<int, bool>(x); 4149*481dde66SAndroid Build Coastguard Worker``` 4150*481dde66SAndroid Build Coastguard Worker 4151*481dde66SAndroid Build Coastguard WorkerAre we using a single-template-parameter action where `bool` refers to the type 4152*481dde66SAndroid Build Coastguard Workerof `x`, or a two-template-parameter action where the compiler is asked to infer 4153*481dde66SAndroid Build Coastguard Workerthe type of `x`? 4154*481dde66SAndroid Build Coastguard Worker 4155*481dde66SAndroid Build Coastguard Worker### Using the ACTION Object's Type 4156*481dde66SAndroid Build Coastguard Worker 4157*481dde66SAndroid Build Coastguard WorkerIf you are writing a function that returns an `ACTION` object, you'll need to 4158*481dde66SAndroid Build Coastguard Workerknow its type. The type depends on the macro used to define the action and the 4159*481dde66SAndroid Build Coastguard Workerparameter types. The rule is relatively simple: 4160*481dde66SAndroid Build Coastguard Worker 4161*481dde66SAndroid Build Coastguard Worker 4162*481dde66SAndroid Build Coastguard Worker| Given Definition | Expression | Has Type | 4163*481dde66SAndroid Build Coastguard Worker| ----------------------------- | ------------------- | --------------------- | 4164*481dde66SAndroid Build Coastguard Worker| `ACTION(Foo)` | `Foo()` | `FooAction` | 4165*481dde66SAndroid Build Coastguard Worker| `ACTION_TEMPLATE(Foo, HAS_m_TEMPLATE_PARAMS(...), AND_0_VALUE_PARAMS())` | `Foo<t1, ..., t_m>()` | `FooAction<t1, ..., t_m>` | 4166*481dde66SAndroid Build Coastguard Worker| `ACTION_P(Bar, param)` | `Bar(int_value)` | `BarActionP<int>` | 4167*481dde66SAndroid Build Coastguard Worker| `ACTION_TEMPLATE(Bar, HAS_m_TEMPLATE_PARAMS(...), AND_1_VALUE_PARAMS(p1))` | `Bar<t1, ..., t_m>(int_value)` | `BarActionP<t1, ..., t_m, int>` | 4168*481dde66SAndroid Build Coastguard Worker| `ACTION_P2(Baz, p1, p2)` | `Baz(bool_value, int_value)` | `BazActionP2<bool, int>` | 4169*481dde66SAndroid Build Coastguard Worker| `ACTION_TEMPLATE(Baz, HAS_m_TEMPLATE_PARAMS(...), AND_2_VALUE_PARAMS(p1, p2))` | `Baz<t1, ..., t_m>(bool_value, int_value)` | `BazActionP2<t1, ..., t_m, bool, int>` | 4170*481dde66SAndroid Build Coastguard Worker| ... | ... | ... | 4171*481dde66SAndroid Build Coastguard Worker 4172*481dde66SAndroid Build Coastguard Worker 4173*481dde66SAndroid Build Coastguard WorkerNote that we have to pick different suffixes (`Action`, `ActionP`, `ActionP2`, 4174*481dde66SAndroid Build Coastguard Workerand etc) for actions with different numbers of value parameters, or the action 4175*481dde66SAndroid Build Coastguard Workerdefinitions cannot be overloaded on the number of them. 4176*481dde66SAndroid Build Coastguard Worker 4177*481dde66SAndroid Build Coastguard Worker### Writing New Monomorphic Actions {#NewMonoActions} 4178*481dde66SAndroid Build Coastguard Worker 4179*481dde66SAndroid Build Coastguard WorkerWhile the `ACTION*` macros are very convenient, sometimes they are 4180*481dde66SAndroid Build Coastguard Workerinappropriate. For example, despite the tricks shown in the previous recipes, 4181*481dde66SAndroid Build Coastguard Workerthey don't let you directly specify the types of the mock function arguments and 4182*481dde66SAndroid Build Coastguard Workerthe action parameters, which in general leads to unoptimized compiler error 4183*481dde66SAndroid Build Coastguard Workermessages that can baffle unfamiliar users. They also don't allow overloading 4184*481dde66SAndroid Build Coastguard Workeractions based on parameter types without jumping through some hoops. 4185*481dde66SAndroid Build Coastguard Worker 4186*481dde66SAndroid Build Coastguard WorkerAn alternative to the `ACTION*` macros is to implement 4187*481dde66SAndroid Build Coastguard Worker`::testing::ActionInterface<F>`, where `F` is the type of the mock function in 4188*481dde66SAndroid Build Coastguard Workerwhich the action will be used. For example: 4189*481dde66SAndroid Build Coastguard Worker 4190*481dde66SAndroid Build Coastguard Worker```cpp 4191*481dde66SAndroid Build Coastguard Workertemplate <typename F> 4192*481dde66SAndroid Build Coastguard Workerclass ActionInterface { 4193*481dde66SAndroid Build Coastguard Worker public: 4194*481dde66SAndroid Build Coastguard Worker virtual ~ActionInterface(); 4195*481dde66SAndroid Build Coastguard Worker 4196*481dde66SAndroid Build Coastguard Worker // Performs the action. Result is the return type of function type 4197*481dde66SAndroid Build Coastguard Worker // F, and ArgumentTuple is the tuple of arguments of F. 4198*481dde66SAndroid Build Coastguard Worker // 4199*481dde66SAndroid Build Coastguard Worker 4200*481dde66SAndroid Build Coastguard Worker // For example, if F is int(bool, const string&), then Result would 4201*481dde66SAndroid Build Coastguard Worker // be int, and ArgumentTuple would be std::tuple<bool, const string&>. 4202*481dde66SAndroid Build Coastguard Worker virtual Result Perform(const ArgumentTuple& args) = 0; 4203*481dde66SAndroid Build Coastguard Worker}; 4204*481dde66SAndroid Build Coastguard Worker``` 4205*481dde66SAndroid Build Coastguard Worker 4206*481dde66SAndroid Build Coastguard Worker```cpp 4207*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 4208*481dde66SAndroid Build Coastguard Workerusing ::testing::Action; 4209*481dde66SAndroid Build Coastguard Workerusing ::testing::ActionInterface; 4210*481dde66SAndroid Build Coastguard Workerusing ::testing::MakeAction; 4211*481dde66SAndroid Build Coastguard Worker 4212*481dde66SAndroid Build Coastguard Workertypedef int IncrementMethod(int*); 4213*481dde66SAndroid Build Coastguard Worker 4214*481dde66SAndroid Build Coastguard Workerclass IncrementArgumentAction : public ActionInterface<IncrementMethod> { 4215*481dde66SAndroid Build Coastguard Worker public: 4216*481dde66SAndroid Build Coastguard Worker int Perform(const std::tuple<int*>& args) override { 4217*481dde66SAndroid Build Coastguard Worker int* p = std::get<0>(args); // Grabs the first argument. 4218*481dde66SAndroid Build Coastguard Worker return *p++; 4219*481dde66SAndroid Build Coastguard Worker } 4220*481dde66SAndroid Build Coastguard Worker}; 4221*481dde66SAndroid Build Coastguard Worker 4222*481dde66SAndroid Build Coastguard WorkerAction<IncrementMethod> IncrementArgument() { 4223*481dde66SAndroid Build Coastguard Worker return MakeAction(new IncrementArgumentAction); 4224*481dde66SAndroid Build Coastguard Worker} 4225*481dde66SAndroid Build Coastguard Worker 4226*481dde66SAndroid Build Coastguard Worker... 4227*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, Baz(_)) 4228*481dde66SAndroid Build Coastguard Worker .WillOnce(IncrementArgument()); 4229*481dde66SAndroid Build Coastguard Worker 4230*481dde66SAndroid Build Coastguard Worker int n = 5; 4231*481dde66SAndroid Build Coastguard Worker foo.Baz(&n); // Should return 5 and change n to 6. 4232*481dde66SAndroid Build Coastguard Worker``` 4233*481dde66SAndroid Build Coastguard Worker 4234*481dde66SAndroid Build Coastguard Worker### Writing New Polymorphic Actions {#NewPolyActions} 4235*481dde66SAndroid Build Coastguard Worker 4236*481dde66SAndroid Build Coastguard WorkerThe previous recipe showed you how to define your own action. This is all good, 4237*481dde66SAndroid Build Coastguard Workerexcept that you need to know the type of the function in which the action will 4238*481dde66SAndroid Build Coastguard Workerbe used. Sometimes that can be a problem. For example, if you want to use the 4239*481dde66SAndroid Build Coastguard Workeraction in functions with *different* types (e.g. like `Return()` and 4240*481dde66SAndroid Build Coastguard Worker`SetArgPointee()`). 4241*481dde66SAndroid Build Coastguard Worker 4242*481dde66SAndroid Build Coastguard WorkerIf an action can be used in several types of mock functions, we say it's 4243*481dde66SAndroid Build Coastguard Worker*polymorphic*. The `MakePolymorphicAction()` function template makes it easy to 4244*481dde66SAndroid Build Coastguard Workerdefine such an action: 4245*481dde66SAndroid Build Coastguard Worker 4246*481dde66SAndroid Build Coastguard Worker```cpp 4247*481dde66SAndroid Build Coastguard Workernamespace testing { 4248*481dde66SAndroid Build Coastguard Workertemplate <typename Impl> 4249*481dde66SAndroid Build Coastguard WorkerPolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl); 4250*481dde66SAndroid Build Coastguard Worker} // namespace testing 4251*481dde66SAndroid Build Coastguard Worker``` 4252*481dde66SAndroid Build Coastguard Worker 4253*481dde66SAndroid Build Coastguard WorkerAs an example, let's define an action that returns the second argument in the 4254*481dde66SAndroid Build Coastguard Workermock function's argument list. The first step is to define an implementation 4255*481dde66SAndroid Build Coastguard Workerclass: 4256*481dde66SAndroid Build Coastguard Worker 4257*481dde66SAndroid Build Coastguard Worker```cpp 4258*481dde66SAndroid Build Coastguard Workerclass ReturnSecondArgumentAction { 4259*481dde66SAndroid Build Coastguard Worker public: 4260*481dde66SAndroid Build Coastguard Worker template <typename Result, typename ArgumentTuple> 4261*481dde66SAndroid Build Coastguard Worker Result Perform(const ArgumentTuple& args) const { 4262*481dde66SAndroid Build Coastguard Worker // To get the i-th (0-based) argument, use std::get(args). 4263*481dde66SAndroid Build Coastguard Worker return std::get<1>(args); 4264*481dde66SAndroid Build Coastguard Worker } 4265*481dde66SAndroid Build Coastguard Worker}; 4266*481dde66SAndroid Build Coastguard Worker``` 4267*481dde66SAndroid Build Coastguard Worker 4268*481dde66SAndroid Build Coastguard WorkerThis implementation class does *not* need to inherit from any particular class. 4269*481dde66SAndroid Build Coastguard WorkerWhat matters is that it must have a `Perform()` method template. This method 4270*481dde66SAndroid Build Coastguard Workertemplate takes the mock function's arguments as a tuple in a **single** 4271*481dde66SAndroid Build Coastguard Workerargument, and returns the result of the action. It can be either `const` or not, 4272*481dde66SAndroid Build Coastguard Workerbut must be invocable with exactly one template argument, which is the result 4273*481dde66SAndroid Build Coastguard Workertype. In other words, you must be able to call `Perform<R>(args)` where `R` is 4274*481dde66SAndroid Build Coastguard Workerthe mock function's return type and `args` is its arguments in a tuple. 4275*481dde66SAndroid Build Coastguard Worker 4276*481dde66SAndroid Build Coastguard WorkerNext, we use `MakePolymorphicAction()` to turn an instance of the implementation 4277*481dde66SAndroid Build Coastguard Workerclass into the polymorphic action we need. It will be convenient to have a 4278*481dde66SAndroid Build Coastguard Workerwrapper for this: 4279*481dde66SAndroid Build Coastguard Worker 4280*481dde66SAndroid Build Coastguard Worker```cpp 4281*481dde66SAndroid Build Coastguard Workerusing ::testing::MakePolymorphicAction; 4282*481dde66SAndroid Build Coastguard Workerusing ::testing::PolymorphicAction; 4283*481dde66SAndroid Build Coastguard Worker 4284*481dde66SAndroid Build Coastguard WorkerPolymorphicAction<ReturnSecondArgumentAction> ReturnSecondArgument() { 4285*481dde66SAndroid Build Coastguard Worker return MakePolymorphicAction(ReturnSecondArgumentAction()); 4286*481dde66SAndroid Build Coastguard Worker} 4287*481dde66SAndroid Build Coastguard Worker``` 4288*481dde66SAndroid Build Coastguard Worker 4289*481dde66SAndroid Build Coastguard WorkerNow, you can use this polymorphic action the same way you use the built-in ones: 4290*481dde66SAndroid Build Coastguard Worker 4291*481dde66SAndroid Build Coastguard Worker```cpp 4292*481dde66SAndroid Build Coastguard Workerusing ::testing::_; 4293*481dde66SAndroid Build Coastguard Worker 4294*481dde66SAndroid Build Coastguard Workerclass MockFoo : public Foo { 4295*481dde66SAndroid Build Coastguard Worker public: 4296*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(int, DoThis, (bool flag, int n), (override)); 4297*481dde66SAndroid Build Coastguard Worker MOCK_METHOD(string, DoThat, (int x, const char* str1, const char* str2), 4298*481dde66SAndroid Build Coastguard Worker (override)); 4299*481dde66SAndroid Build Coastguard Worker}; 4300*481dde66SAndroid Build Coastguard Worker 4301*481dde66SAndroid Build Coastguard Worker ... 4302*481dde66SAndroid Build Coastguard Worker MockFoo foo; 4303*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThis).WillOnce(ReturnSecondArgument()); 4304*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(foo, DoThat).WillOnce(ReturnSecondArgument()); 4305*481dde66SAndroid Build Coastguard Worker ... 4306*481dde66SAndroid Build Coastguard Worker foo.DoThis(true, 5); // Will return 5. 4307*481dde66SAndroid Build Coastguard Worker foo.DoThat(1, "Hi", "Bye"); // Will return "Hi". 4308*481dde66SAndroid Build Coastguard Worker``` 4309*481dde66SAndroid Build Coastguard Worker 4310*481dde66SAndroid Build Coastguard Worker### Teaching gMock How to Print Your Values 4311*481dde66SAndroid Build Coastguard Worker 4312*481dde66SAndroid Build Coastguard WorkerWhen an uninteresting or unexpected call occurs, gMock prints the argument 4313*481dde66SAndroid Build Coastguard Workervalues and the stack trace to help you debug. Assertion macros like 4314*481dde66SAndroid Build Coastguard Worker`EXPECT_THAT` and `EXPECT_EQ` also print the values in question when the 4315*481dde66SAndroid Build Coastguard Workerassertion fails. gMock and googletest do this using googletest's user-extensible 4316*481dde66SAndroid Build Coastguard Workervalue printer. 4317*481dde66SAndroid Build Coastguard Worker 4318*481dde66SAndroid Build Coastguard WorkerThis printer knows how to print built-in C++ types, native arrays, STL 4319*481dde66SAndroid Build Coastguard Workercontainers, and any type that supports the `<<` operator. For other types, it 4320*481dde66SAndroid Build Coastguard Workerprints the raw bytes in the value and hopes that you the user can figure it out. 4321*481dde66SAndroid Build Coastguard Worker[The GoogleTest advanced guide](advanced.md#teaching-googletest-how-to-print-your-values) 4322*481dde66SAndroid Build Coastguard Workerexplains how to extend the printer to do a better job at printing your 4323*481dde66SAndroid Build Coastguard Workerparticular type than to dump the bytes. 4324*481dde66SAndroid Build Coastguard Worker 4325*481dde66SAndroid Build Coastguard Worker## Useful Mocks Created Using gMock 4326*481dde66SAndroid Build Coastguard Worker 4327*481dde66SAndroid Build Coastguard Worker<!--#include file="includes/g3_testing_LOGs.md"--> 4328*481dde66SAndroid Build Coastguard Worker<!--#include file="includes/g3_mock_callbacks.md"--> 4329*481dde66SAndroid Build Coastguard Worker 4330*481dde66SAndroid Build Coastguard Worker### Mock std::function {#MockFunction} 4331*481dde66SAndroid Build Coastguard Worker 4332*481dde66SAndroid Build Coastguard Worker`std::function` is a general function type introduced in C++11. It is a 4333*481dde66SAndroid Build Coastguard Workerpreferred way of passing callbacks to new interfaces. Functions are copyable, 4334*481dde66SAndroid Build Coastguard Workerand are not usually passed around by pointer, which makes them tricky to mock. 4335*481dde66SAndroid Build Coastguard WorkerBut fear not - `MockFunction` can help you with that. 4336*481dde66SAndroid Build Coastguard Worker 4337*481dde66SAndroid Build Coastguard Worker`MockFunction<R(T1, ..., Tn)>` has a mock method `Call()` with the signature: 4338*481dde66SAndroid Build Coastguard Worker 4339*481dde66SAndroid Build Coastguard Worker```cpp 4340*481dde66SAndroid Build Coastguard Worker R Call(T1, ..., Tn); 4341*481dde66SAndroid Build Coastguard Worker``` 4342*481dde66SAndroid Build Coastguard Worker 4343*481dde66SAndroid Build Coastguard WorkerIt also has a `AsStdFunction()` method, which creates a `std::function` proxy 4344*481dde66SAndroid Build Coastguard Workerforwarding to Call: 4345*481dde66SAndroid Build Coastguard Worker 4346*481dde66SAndroid Build Coastguard Worker```cpp 4347*481dde66SAndroid Build Coastguard Worker std::function<R(T1, ..., Tn)> AsStdFunction(); 4348*481dde66SAndroid Build Coastguard Worker``` 4349*481dde66SAndroid Build Coastguard Worker 4350*481dde66SAndroid Build Coastguard WorkerTo use `MockFunction`, first create `MockFunction` object and set up 4351*481dde66SAndroid Build Coastguard Workerexpectations on its `Call` method. Then pass proxy obtained from 4352*481dde66SAndroid Build Coastguard Worker`AsStdFunction()` to the code you are testing. For example: 4353*481dde66SAndroid Build Coastguard Worker 4354*481dde66SAndroid Build Coastguard Worker```cpp 4355*481dde66SAndroid Build Coastguard WorkerTEST(FooTest, RunsCallbackWithBarArgument) { 4356*481dde66SAndroid Build Coastguard Worker // 1. Create a mock object. 4357*481dde66SAndroid Build Coastguard Worker MockFunction<int(string)> mock_function; 4358*481dde66SAndroid Build Coastguard Worker 4359*481dde66SAndroid Build Coastguard Worker // 2. Set expectations on Call() method. 4360*481dde66SAndroid Build Coastguard Worker EXPECT_CALL(mock_function, Call("bar")).WillOnce(Return(1)); 4361*481dde66SAndroid Build Coastguard Worker 4362*481dde66SAndroid Build Coastguard Worker // 3. Exercise code that uses std::function. 4363*481dde66SAndroid Build Coastguard Worker Foo(mock_function.AsStdFunction()); 4364*481dde66SAndroid Build Coastguard Worker // Foo's signature can be either of: 4365*481dde66SAndroid Build Coastguard Worker // void Foo(const std::function<int(string)>& fun); 4366*481dde66SAndroid Build Coastguard Worker // void Foo(std::function<int(string)> fun); 4367*481dde66SAndroid Build Coastguard Worker 4368*481dde66SAndroid Build Coastguard Worker // 4. All expectations will be verified when mock_function 4369*481dde66SAndroid Build Coastguard Worker // goes out of scope and is destroyed. 4370*481dde66SAndroid Build Coastguard Worker} 4371*481dde66SAndroid Build Coastguard Worker``` 4372*481dde66SAndroid Build Coastguard Worker 4373*481dde66SAndroid Build Coastguard WorkerRemember that function objects created with `AsStdFunction()` are just 4374*481dde66SAndroid Build Coastguard Workerforwarders. If you create multiple of them, they will share the same set of 4375*481dde66SAndroid Build Coastguard Workerexpectations. 4376*481dde66SAndroid Build Coastguard Worker 4377*481dde66SAndroid Build Coastguard WorkerAlthough `std::function` supports unlimited number of arguments, `MockFunction` 4378*481dde66SAndroid Build Coastguard Workerimplementation is limited to ten. If you ever hit that limit... well, your 4379*481dde66SAndroid Build Coastguard Workercallback has bigger problems than being mockable. :-) 4380