GoogleTest - Google Testing and Mocking Framework (grpc protobuff依赖)
https://google.github.io/googletest/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
7.2 KiB
241 lines
7.2 KiB
# 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. |
|
|
|