| # gMock Cheat Sheet | |
| ## Defining a Mock Class | |
| ### Mocking a Normal Class {#MockClass} | |
| Given | |
| ```cpp | |
| class Foo { | |
| public: | |
| virtual ~Foo(); | |
| virtual int GetSize() const = 0; | |
| virtual string Describe(const char* name) = 0; | |
| virtual string Describe(int type) = 0; | |
| virtual bool Process(Bar elem, int count) = 0; | |
| }; | |
| ``` | |
| (note that `~Foo()` **must** be virtual) we can define its mock as | |
| ```cpp | |
| #include <gmock/gmock.h> | |
| class MockFoo : public Foo { | |
| public: | |
| MOCK_METHOD(int, GetSize, (), (const, override)); | |
| MOCK_METHOD(string, Describe, (const char* name), (override)); | |
| MOCK_METHOD(string, Describe, (int type), (override)); | |
| MOCK_METHOD(bool, Process, (Bar elem, int count), (override)); | |
| }; | |
| ``` | |
| To create a "nice" mock, which ignores all uninteresting calls, a "naggy" mock, | |
| which warns on all uninteresting calls, or a "strict" mock, which treats them as | |
| failures: | |
| ```cpp | |
| using ::testing::NiceMock; | |
| using ::testing::NaggyMock; | |
| using ::testing::StrictMock; | |
| NiceMock<MockFoo> nice_foo; // The type is a subclass of MockFoo. | |
| NaggyMock<MockFoo> naggy_foo; // The type is a subclass of MockFoo. | |
| StrictMock<MockFoo> strict_foo; // The type is a subclass of MockFoo. | |
| ``` | |
| {: .callout .note} | |
| **Note:** A mock object is currently naggy by default. We may make it nice by | |
| default in the future. | |
| ### Mocking a Class Template {#MockTemplate} | |
| Class templates can be mocked just like any class. | |
| To mock | |
| ```cpp | |
| template <typename Elem> | |
| class StackInterface { | |
| public: | |
| virtual ~StackInterface(); | |
| virtual int GetSize() const = 0; | |
| virtual void Push(const Elem& x) = 0; | |
| }; | |
| ``` | |
| (note that all member functions that are mocked, including `~StackInterface()` | |
| **must** be virtual). | |
| ```cpp | |
| template <typename Elem> | |
| class MockStack : public StackInterface<Elem> { | |
| public: | |
| MOCK_METHOD(int, GetSize, (), (const, override)); | |
| MOCK_METHOD(void, Push, (const Elem& x), (override)); | |
| }; | |
| ``` | |
| ### Specifying Calling Conventions for Mock Functions | |
| If your mock function doesn't use the default calling convention, you can | |
| specify it by adding `Calltype(convention)` to `MOCK_METHOD`'s 4th parameter. | |
| For example, | |
| ```cpp | |
| MOCK_METHOD(bool, Foo, (int n), (Calltype(STDMETHODCALLTYPE))); | |
| MOCK_METHOD(int, Bar, (double x, double y), | |
| (const, Calltype(STDMETHODCALLTYPE))); | |
| ``` | |
| where `STDMETHODCALLTYPE` is defined by `<objbase.h>` on Windows. | |
| ## Using Mocks in Tests {#UsingMocks} | |
| The typical work flow is: | |
| 1. Import the gMock names you need to use. All gMock symbols are in the | |
| `testing` namespace unless they are macros or otherwise noted. | |
| 2. Create the mock objects. | |
| 3. Optionally, set the default actions of the mock objects. | |
| 4. Set your expectations on the mock objects (How will they be called? What | |
| will they do?). | |
| 5. Exercise code that uses the mock objects; if necessary, check the result | |
| using googletest assertions. | |
| 6. When a mock object is destructed, gMock automatically verifies that all | |
| expectations on it have been satisfied. | |
| Here's an example: | |
| ```cpp | |
| using ::testing::Return; // #1 | |
| TEST(BarTest, DoesThis) { | |
| MockFoo foo; // #2 | |
| ON_CALL(foo, GetSize()) // #3 | |
| .WillByDefault(Return(1)); | |
| // ... other default actions ... | |
| EXPECT_CALL(foo, Describe(5)) // #4 | |
| .Times(3) | |
| .WillRepeatedly(Return("Category 5")); | |
| // ... other expectations ... | |
| EXPECT_EQ(MyProductionFunction(&foo), "good"); // #5 | |
| } // #6 | |
| ``` | |
| ## Setting Default Actions {#OnCall} | |
| gMock has a **built-in default action** for any function that returns `void`, | |
| `bool`, a numeric value, or a pointer. In C++11, it will additionally returns | |
| the default-constructed value, if one exists for the given type. | |
| To customize the default action for functions with return type `T`, use | |
| [`DefaultValue<T>`](reference/mocking.md#DefaultValue). For example: | |
| ```cpp | |
| // Sets the default action for return type std::unique_ptr<Buzz> to | |
| // creating a new Buzz every time. | |
| DefaultValue<std::unique_ptr<Buzz>>::SetFactory( | |
| [] { return std::make_unique<Buzz>(AccessLevel::kInternal); }); | |
| // When this fires, the default action of MakeBuzz() will run, which | |
| // will return a new Buzz object. | |
| EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")).Times(AnyNumber()); | |
| auto buzz1 = mock_buzzer_.MakeBuzz("hello"); | |
| auto buzz2 = mock_buzzer_.MakeBuzz("hello"); | |
| EXPECT_NE(buzz1, nullptr); | |
| EXPECT_NE(buzz2, nullptr); | |
| EXPECT_NE(buzz1, buzz2); | |
| // Resets the default action for return type std::unique_ptr<Buzz>, | |
| // to avoid interfere with other tests. | |
| DefaultValue<std::unique_ptr<Buzz>>::Clear(); | |
| ``` | |
| To customize the default action for a particular method of a specific mock | |
| object, use [`ON_CALL`](reference/mocking.md#ON_CALL). `ON_CALL` has a similar | |
| syntax to `EXPECT_CALL`, but it is used for setting default behaviors when you | |
| do not require that the mock method is called. See | |
| [Knowing When to Expect](gmock_cook_book.md#UseOnCall) for a more detailed | |
| discussion. | |
| ## Setting Expectations {#ExpectCall} | |
| See [`EXPECT_CALL`](reference/mocking.md#EXPECT_CALL) in the Mocking Reference. | |
| ## Matchers {#MatcherList} | |
| See the [Matchers Reference](reference/matchers.md). | |
| ## Actions {#ActionList} | |
| See the [Actions Reference](reference/actions.md). | |
| ## Cardinalities {#CardinalityList} | |
| See the [`Times` clause](reference/mocking.md#EXPECT_CALL.Times) of | |
| `EXPECT_CALL` in the Mocking Reference. | |
| ## Expectation Order | |
| By default, expectations can be matched in *any* order. If some or all | |
| expectations must be matched in a given order, you can use the | |
| [`After` clause](reference/mocking.md#EXPECT_CALL.After) or | |
| [`InSequence` clause](reference/mocking.md#EXPECT_CALL.InSequence) of | |
| `EXPECT_CALL`, or use an [`InSequence` object](reference/mocking.md#InSequence). | |
| ## Verifying and Resetting a Mock | |
| gMock will verify the expectations on a mock object when it is destructed, or | |
| you can do it earlier: | |
| ```cpp | |
| using ::testing::Mock; | |
| ... | |
| // Verifies and removes the expectations on mock_obj; | |
| // returns true if and only if successful. | |
| Mock::VerifyAndClearExpectations(&mock_obj); | |
| ... | |
| // Verifies and removes the expectations on mock_obj; | |
| // also removes the default actions set by ON_CALL(); | |
| // returns true if and only if successful. | |
| Mock::VerifyAndClear(&mock_obj); | |
| ``` | |
| Do not set new expectations after verifying and clearing a mock after its use. | |
| Setting expectations after code that exercises the mock has undefined behavior. | |
| See [Using Mocks in Tests](gmock_for_dummies.md#using-mocks-in-tests) for more | |
| information. | |
| You can also tell gMock that a mock object can be leaked and doesn't need to be | |
| verified: | |
| ```cpp | |
| Mock::AllowLeak(&mock_obj); | |
| ``` | |
| ## Mock Classes | |
| gMock defines a convenient mock class template | |
| ```cpp | |
| class MockFunction<R(A1, ..., An)> { | |
| public: | |
| MOCK_METHOD(R, Call, (A1, ..., An)); | |
| }; | |
| ``` | |
| See this [recipe](gmock_cook_book.md#UsingCheckPoints) for one application of | |
| it. | |
| ## Flags | |
| | Flag | Description | | |
| | :----------------------------- | :---------------------------------------- | | |
| | `--gmock_catch_leaked_mocks=0` | Don't report leaked mock objects as failures. | | |
| | `--gmock_verbose=LEVEL` | Sets the default verbosity level (`info`, `warning`, or `error`) of Google Mock messages. | |