mirror of
https://github.com/google/googletest.git
synced 2025-01-14 16:37:56 +08:00
Googletest export
Create new Mocking Reference PiperOrigin-RevId: 376951575
This commit is contained in:
parent
2bd3481666
commit
5f6a14c846
@ -21,6 +21,8 @@ nav:
|
|||||||
url: "/gmock_cheat_sheet.html"
|
url: "/gmock_cheat_sheet.html"
|
||||||
- section: "References"
|
- section: "References"
|
||||||
items:
|
items:
|
||||||
|
- title: "Mocking Reference"
|
||||||
|
url: "/reference/mocking.html"
|
||||||
- title: "Assertions"
|
- title: "Assertions"
|
||||||
url: "/reference/assertions.html"
|
url: "/reference/assertions.html"
|
||||||
- title: "Matchers"
|
- title: "Matchers"
|
||||||
|
@ -133,22 +133,8 @@ 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
|
`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.
|
the default-constructed value, if one exists for the given type.
|
||||||
|
|
||||||
To customize the default action for functions with return type *`T`*:
|
To customize the default action for functions with return type `T`, use
|
||||||
|
[`DefaultValue<T>`](reference/mocking.md#DefaultValue). For example:
|
||||||
```cpp
|
|
||||||
using ::testing::DefaultValue;
|
|
||||||
|
|
||||||
// Sets the default value to be returned. T must be CopyConstructible.
|
|
||||||
DefaultValue<T>::Set(value);
|
|
||||||
// Sets a factory. Will be invoked on demand. T must be MoveConstructible.
|
|
||||||
// T MakeT();
|
|
||||||
DefaultValue<T>::SetFactory(&MakeT);
|
|
||||||
// ... use the mocks ...
|
|
||||||
// Resets the default value.
|
|
||||||
DefaultValue<T>::Clear();
|
|
||||||
```
|
|
||||||
|
|
||||||
Example usage:
|
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
// Sets the default action for return type std::unique_ptr<Buzz> to
|
// Sets the default action for return type std::unique_ptr<Buzz> to
|
||||||
@ -172,55 +158,15 @@ Example usage:
|
|||||||
```
|
```
|
||||||
|
|
||||||
To customize the default action for a particular method of a specific mock
|
To customize the default action for a particular method of a specific mock
|
||||||
object, use `ON_CALL()`. `ON_CALL()` has a similar syntax to `EXPECT_CALL()`,
|
object, use [`ON_CALL`](reference/mocking.md#ON_CALL). `ON_CALL` has a similar
|
||||||
but it is used for setting default behaviors (when you do not require that the
|
syntax to `EXPECT_CALL`, but it is used for setting default behaviors when you
|
||||||
mock method is called). See [here](gmock_cook_book.md#UseOnCall) for a more
|
do not require that the mock method is called. See
|
||||||
detailed discussion.
|
[Knowing When to Expect](gmock_cook_book.md#UseOnCall) for a more detailed
|
||||||
|
discussion.
|
||||||
```cpp
|
|
||||||
ON_CALL(mock-object, method(matchers))
|
|
||||||
.With(multi-argument-matcher) ?
|
|
||||||
.WillByDefault(action);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Setting Expectations {#ExpectCall}
|
## Setting Expectations {#ExpectCall}
|
||||||
|
|
||||||
`EXPECT_CALL()` sets **expectations** on a mock method (How will it be called?
|
See [`EXPECT_CALL`](reference/mocking.md#EXPECT_CALL) in the Mocking Reference.
|
||||||
What will it do?):
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
EXPECT_CALL(mock-object, method (matchers)?)
|
|
||||||
.With(multi-argument-matcher) ?
|
|
||||||
.Times(cardinality) ?
|
|
||||||
.InSequence(sequences) *
|
|
||||||
.After(expectations) *
|
|
||||||
.WillOnce(action) *
|
|
||||||
.WillRepeatedly(action) ?
|
|
||||||
.RetiresOnSaturation(); ?
|
|
||||||
```
|
|
||||||
|
|
||||||
For each item above, `?` means it can be used at most once, while `*` means it
|
|
||||||
can be used any number of times.
|
|
||||||
|
|
||||||
In order to pass, `EXPECT_CALL` must be used before the calls are actually made.
|
|
||||||
|
|
||||||
The `(matchers)` is a comma-separated list of matchers that correspond to each
|
|
||||||
of the arguments of `method`, and sets the expectation only for calls of
|
|
||||||
`method` that matches all of the matchers.
|
|
||||||
|
|
||||||
If `(matchers)` is omitted, the expectation is the same as if the matchers were
|
|
||||||
set to anything matchers (for example, `(_, _, _, _)` for a four-arg method).
|
|
||||||
|
|
||||||
If `Times()` is omitted, the cardinality is assumed to be:
|
|
||||||
|
|
||||||
* `Times(1)` when there is neither `WillOnce()` nor `WillRepeatedly()`;
|
|
||||||
* `Times(n)` when there are `n` `WillOnce()`s but no `WillRepeatedly()`, where
|
|
||||||
`n` >= 1; or
|
|
||||||
* `Times(AtLeast(n))` when there are `n` `WillOnce()`s and a
|
|
||||||
`WillRepeatedly()`, where `n` >= 0.
|
|
||||||
|
|
||||||
A method with no `EXPECT_CALL()` is free to be invoked *any number of times*,
|
|
||||||
and the default action will be taken each time.
|
|
||||||
|
|
||||||
## Matchers {#MatcherList}
|
## Matchers {#MatcherList}
|
||||||
|
|
||||||
@ -232,99 +178,16 @@ See the [Actions Reference](reference/actions.md).
|
|||||||
|
|
||||||
## Cardinalities {#CardinalityList}
|
## Cardinalities {#CardinalityList}
|
||||||
|
|
||||||
These are used in `Times()` to specify how many times a mock function will be
|
See the [`Times` clause](reference/mocking.md#EXPECT_CALL.Times) of
|
||||||
called:
|
`EXPECT_CALL` in the Mocking Reference.
|
||||||
|
|
||||||
| | |
|
|
||||||
| :---------------- | :----------------------------------------------------- |
|
|
||||||
| `AnyNumber()` | The function can be called any number of times. |
|
|
||||||
| `AtLeast(n)` | The call is expected at least `n` times. |
|
|
||||||
| `AtMost(n)` | The call is expected at most `n` times. |
|
|
||||||
| `Between(m, n)` | The call is expected between `m` and `n` (inclusive) times. |
|
|
||||||
| `Exactly(n) or n` | The call is expected exactly `n` times. In particular, the call should never happen when `n` is 0. |
|
|
||||||
|
|
||||||
## Expectation Order
|
## Expectation Order
|
||||||
|
|
||||||
By default, the expectations can be matched in *any* order. If some or all
|
By default, expectations can be matched in *any* order. If some or all
|
||||||
expectations must be matched in a given order, there are two ways to specify it.
|
expectations must be matched in a given order, you can use the
|
||||||
They can be used either independently or together.
|
[`After` clause](reference/mocking.md#EXPECT_CALL.After) or
|
||||||
|
[`InSequence` clause](reference/mocking.md#EXPECT_CALL.InSequence) of
|
||||||
### The After Clause {#AfterClause}
|
`EXPECT_CALL`, or use an [`InSequence` object](reference/mocking.md#InSequence).
|
||||||
|
|
||||||
```cpp
|
|
||||||
using ::testing::Expectation;
|
|
||||||
...
|
|
||||||
Expectation init_x = EXPECT_CALL(foo, InitX());
|
|
||||||
Expectation init_y = EXPECT_CALL(foo, InitY());
|
|
||||||
EXPECT_CALL(foo, Bar())
|
|
||||||
.After(init_x, init_y);
|
|
||||||
```
|
|
||||||
|
|
||||||
says that `Bar()` can be called only after both `InitX()` and `InitY()` have
|
|
||||||
been called.
|
|
||||||
|
|
||||||
If you don't know how many pre-requisites an expectation has when you write it,
|
|
||||||
you can use an `ExpectationSet` to collect them:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
using ::testing::ExpectationSet;
|
|
||||||
...
|
|
||||||
ExpectationSet all_inits;
|
|
||||||
for (int i = 0; i < element_count; i++) {
|
|
||||||
all_inits += EXPECT_CALL(foo, InitElement(i));
|
|
||||||
}
|
|
||||||
EXPECT_CALL(foo, Bar())
|
|
||||||
.After(all_inits);
|
|
||||||
```
|
|
||||||
|
|
||||||
says that `Bar()` can be called only after all elements have been initialized
|
|
||||||
(but we don't care about which elements get initialized before the others).
|
|
||||||
|
|
||||||
Modifying an `ExpectationSet` after using it in an `.After()` doesn't affect the
|
|
||||||
meaning of the `.After()`.
|
|
||||||
|
|
||||||
### Sequences {#UsingSequences}
|
|
||||||
|
|
||||||
When you have a long chain of sequential expectations, it's easier to specify
|
|
||||||
the order using **sequences**, which don't require you to give each expectation
|
|
||||||
in the chain a different name. *All expected calls* in the same sequence must
|
|
||||||
occur in the order they are specified.
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
using ::testing::Return;
|
|
||||||
using ::testing::Sequence;
|
|
||||||
Sequence s1, s2;
|
|
||||||
...
|
|
||||||
EXPECT_CALL(foo, Reset())
|
|
||||||
.InSequence(s1, s2)
|
|
||||||
.WillOnce(Return(true));
|
|
||||||
EXPECT_CALL(foo, GetSize())
|
|
||||||
.InSequence(s1)
|
|
||||||
.WillOnce(Return(1));
|
|
||||||
EXPECT_CALL(foo, Describe(A<const char*>()))
|
|
||||||
.InSequence(s2)
|
|
||||||
.WillOnce(Return("dummy"));
|
|
||||||
```
|
|
||||||
|
|
||||||
says that `Reset()` must be called before *both* `GetSize()` *and* `Describe()`,
|
|
||||||
and the latter two can occur in any order.
|
|
||||||
|
|
||||||
To put many expectations in a sequence conveniently:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
using ::testing::InSequence;
|
|
||||||
{
|
|
||||||
InSequence seq;
|
|
||||||
|
|
||||||
EXPECT_CALL(...)...;
|
|
||||||
EXPECT_CALL(...)...;
|
|
||||||
...
|
|
||||||
EXPECT_CALL(...)...;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
says that all expected calls in the scope of `seq` must occur in strict order.
|
|
||||||
The name `seq` is irrelevant.
|
|
||||||
|
|
||||||
## Verifying and Resetting a Mock
|
## Verifying and Resetting a Mock
|
||||||
|
|
||||||
|
@ -1711,7 +1711,7 @@ the test should reflect our real intent, instead of being overly constraining.
|
|||||||
|
|
||||||
gMock allows you to impose an arbitrary DAG (directed acyclic graph) on the
|
gMock allows you to impose an arbitrary DAG (directed acyclic graph) on the
|
||||||
calls. One way to express the DAG is to use the
|
calls. One way to express the DAG is to use the
|
||||||
[After](gmock_cheat_sheet.md#AfterClause) clause of `EXPECT_CALL`.
|
[`After` clause](reference/mocking.md#EXPECT_CALL.After) of `EXPECT_CALL`.
|
||||||
|
|
||||||
Another way is via the `InSequence()` clause (not the same as the `InSequence`
|
Another way is via the `InSequence()` clause (not the same as the `InSequence`
|
||||||
class), which we borrowed from jMock 2. It's less flexible than `After()`, but
|
class), which we borrowed from jMock 2. It's less flexible than `After()`, but
|
||||||
|
587
docs/reference/mocking.md
Normal file
587
docs/reference/mocking.md
Normal file
@ -0,0 +1,587 @@
|
|||||||
|
# Mocking Reference
|
||||||
|
|
||||||
|
This page lists the facilities provided by GoogleTest for creating and working
|
||||||
|
with mock objects. To use them, include the header
|
||||||
|
`gmock/gmock.h`.
|
||||||
|
|
||||||
|
## Macros {#macros}
|
||||||
|
|
||||||
|
GoogleTest defines the following macros for working with mocks.
|
||||||
|
|
||||||
|
### MOCK_METHOD {#MOCK_METHOD}
|
||||||
|
|
||||||
|
`MOCK_METHOD(`*`return_type`*`,`*`method_name`*`, (`*`args...`*`));` \
|
||||||
|
`MOCK_METHOD(`*`return_type`*`,`*`method_name`*`, (`*`args...`*`),
|
||||||
|
(`*`specs...`*`));`
|
||||||
|
|
||||||
|
Defines a mock method *`method_name`* with arguments `(`*`args...`*`)` and
|
||||||
|
return type *`return_type`* within a mock class.
|
||||||
|
|
||||||
|
The parameters of `MOCK_METHOD` mirror the method declaration. The optional
|
||||||
|
fourth parameter *`specs...`* is a comma-separated list of qualifiers. The
|
||||||
|
following qualifiers are accepted:
|
||||||
|
|
||||||
|
| Qualifier | Meaning |
|
||||||
|
| -------------------------- | -------------------------------------------- |
|
||||||
|
| `const` | Makes the mocked method a `const` method. Required if overriding a `const` method. |
|
||||||
|
| `override` | Marks the method with `override`. Recommended if overriding a `virtual` method. |
|
||||||
|
| `noexcept` | Marks the method with `noexcept`. Required if overriding a `noexcept` method. |
|
||||||
|
| `Calltype(`*`calltype`*`)` | Sets the call type for the method, for example `Calltype(STDMETHODCALLTYPE)`. Useful on Windows. |
|
||||||
|
| `ref(`*`qualifier`*`)` | Marks the method with the given reference qualifier, for example `ref(&)` or `ref(&&)`. Required if overriding a method that has a reference qualifier. |
|
||||||
|
|
||||||
|
Note that commas in arguments prevent `MOCK_METHOD` from parsing the arguments
|
||||||
|
correctly if they are not appropriately surrounded by parentheses. See the
|
||||||
|
following example:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
class MyMock {
|
||||||
|
public:
|
||||||
|
// The following 2 lines will not compile due to commas in the arguments:
|
||||||
|
MOCK_METHOD(std::pair<bool, int>, GetPair, ()); // Error!
|
||||||
|
MOCK_METHOD(bool, CheckMap, (std::map<int, double>, bool)); // Error!
|
||||||
|
|
||||||
|
// One solution - wrap arguments that contain commas in parentheses:
|
||||||
|
MOCK_METHOD((std::pair<bool, int>), GetPair, ());
|
||||||
|
MOCK_METHOD(bool, CheckMap, ((std::map<int, double>), bool));
|
||||||
|
|
||||||
|
// Another solution - use type aliases:
|
||||||
|
using BoolAndInt = std::pair<bool, int>;
|
||||||
|
MOCK_METHOD(BoolAndInt, GetPair, ());
|
||||||
|
using MapIntDouble = std::map<int, double>;
|
||||||
|
MOCK_METHOD(bool, CheckMap, (MapIntDouble, bool));
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
`MOCK_METHOD` must be used in the `public:` section of a mock class definition,
|
||||||
|
regardless of whether the method being mocked is `public`, `protected`, or
|
||||||
|
`private` in the base class.
|
||||||
|
|
||||||
|
### EXPECT_CALL {#EXPECT_CALL}
|
||||||
|
|
||||||
|
`EXPECT_CALL(`*`mock_object`*`,`*`method_name`*`(`*`matchers...`*`))`
|
||||||
|
|
||||||
|
Creates an [expectation](../gmock_for_dummies.md#setting-expectations) that the
|
||||||
|
method *`method_name`* of the object *`mock_object`* is called with arguments
|
||||||
|
that match the given matchers *`matchers...`*. `EXPECT_CALL` must precede any
|
||||||
|
code that exercises the mock object.
|
||||||
|
|
||||||
|
The parameter *`matchers...`* is a comma-separated list of
|
||||||
|
[matchers](../gmock_for_dummies.md#matchers-what-arguments-do-we-expect) that
|
||||||
|
correspond to each argument of the method *`method_name`*. The expectation will
|
||||||
|
apply only to calls of *`method_name`* whose arguments match all of the
|
||||||
|
matchers. If `(`*`matchers...`*`)` is omitted, the expectation behaves as if
|
||||||
|
each argument's matcher were a [wildcard matcher (`_`)](matchers.md#wildcard).
|
||||||
|
See the [Matchers Reference](matchers.md) for a list of all built-in matchers.
|
||||||
|
|
||||||
|
The following chainable clauses can be used to modify the expectation, and they
|
||||||
|
must be used in the following order:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
EXPECT_CALL(mock_object, method_name(matchers...))
|
||||||
|
.With(multi_argument_matcher) // Can be used at most once
|
||||||
|
.Times(cardinality) // Can be used at most once
|
||||||
|
.InSequence(sequences...) // Can be used any number of times
|
||||||
|
.After(expectations...) // Can be used any number of times
|
||||||
|
.WillOnce(action) // Can be used any number of times
|
||||||
|
.WillRepeatedly(action) // Can be used at most once
|
||||||
|
.RetiresOnSaturation(); // Can be used at most once
|
||||||
|
```
|
||||||
|
|
||||||
|
See details for each modifier clause below.
|
||||||
|
|
||||||
|
#### With {#EXPECT_CALL.With}
|
||||||
|
|
||||||
|
`.With(`*`multi_argument_matcher`*`)`
|
||||||
|
|
||||||
|
Restricts the expectation to apply only to mock function calls whose arguments
|
||||||
|
as a whole match the multi-argument matcher *`multi_argument_matcher`*.
|
||||||
|
|
||||||
|
GoogleTest passes all of the arguments as one tuple into the matcher. The
|
||||||
|
parameter *`multi_argument_matcher`* must thus be a matcher of type
|
||||||
|
`Matcher<std::tuple<A1, ..., An>>`, where `A1, ..., An` are the types of the
|
||||||
|
function arguments.
|
||||||
|
|
||||||
|
For example, the following code sets the expectation that
|
||||||
|
`my_mock.SetPosition()` is called with any two arguments, the first argument
|
||||||
|
being less than the second:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::_;
|
||||||
|
using ::testing::Lt;
|
||||||
|
...
|
||||||
|
EXPECT_CALL(my_mock, SetPosition(_, _))
|
||||||
|
.With(Lt());
|
||||||
|
```
|
||||||
|
|
||||||
|
GoogleTest provides some built-in matchers for 2-tuples, including the `Lt()`
|
||||||
|
matcher above. See [Multi-argument Matchers](matchers.md#MultiArgMatchers).
|
||||||
|
|
||||||
|
The `With` clause can be used at most once on an expectation and must be the
|
||||||
|
first clause.
|
||||||
|
|
||||||
|
#### Times {#EXPECT_CALL.Times}
|
||||||
|
|
||||||
|
`.Times(`*`cardinality`*`)`
|
||||||
|
|
||||||
|
Specifies how many times the mock function call is expected.
|
||||||
|
|
||||||
|
The parameter *`cardinality`* represents the number of expected calls and can be
|
||||||
|
one of the following, all defined in the `::testing` namespace:
|
||||||
|
|
||||||
|
| Cardinality | Meaning |
|
||||||
|
| ------------------- | --------------------------------------------------- |
|
||||||
|
| `AnyNumber()` | The function can be called any number of times. |
|
||||||
|
| `AtLeast(n)` | The function call is expected at least *n* times. |
|
||||||
|
| `AtMost(n)` | The function call is expected at most *n* times. |
|
||||||
|
| `Between(m, n)` | The function call is expected between *m* and *n* times, inclusive. |
|
||||||
|
| `Exactly(n)` or `n` | The function call is expected exactly *n* times. If *n* is 0, the call should never happen. |
|
||||||
|
|
||||||
|
If the `Times` clause is omitted, GoogleTest infers the cardinality as follows:
|
||||||
|
|
||||||
|
* If neither [`WillOnce`](#EXPECT_CALL.WillOnce) nor
|
||||||
|
[`WillRepeatedly`](#EXPECT_CALL.WillRepeatedly) are specified, the inferred
|
||||||
|
cardinality is `Times(1)`.
|
||||||
|
* If there are *n* `WillOnce` clauses and no `WillRepeatedly` clause, where
|
||||||
|
*n* >= 1, the inferred cardinality is `Times(n)`.
|
||||||
|
* If there are *n* `WillOnce` clauses and one `WillRepeatedly` clause, where
|
||||||
|
*n* >= 0, the inferred cardinality is `Times(AtLeast(n))`.
|
||||||
|
|
||||||
|
The `Times` clause can be used at most once on an expectation.
|
||||||
|
|
||||||
|
#### InSequence {#EXPECT_CALL.InSequence}
|
||||||
|
|
||||||
|
`.InSequence(`*`sequences...`*`)`
|
||||||
|
|
||||||
|
Specifies that the mock function call is expected in a certain sequence.
|
||||||
|
|
||||||
|
The parameter *`sequences...`* is any number of [`Sequence`](#Sequence) objects.
|
||||||
|
Expected calls assigned to the same sequence are expected to occur in the order
|
||||||
|
the expectations are declared.
|
||||||
|
|
||||||
|
For example, the following code sets the expectation that the `Reset()` method
|
||||||
|
of `my_mock` is called before both `GetSize()` and `Describe()`, and `GetSize()`
|
||||||
|
and `Describe()` can occur in any order relative to each other:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::Sequence;
|
||||||
|
Sequence s1, s2;
|
||||||
|
...
|
||||||
|
EXPECT_CALL(my_mock, Reset())
|
||||||
|
.InSequence(s1, s2);
|
||||||
|
EXPECT_CALL(my_mock, GetSize())
|
||||||
|
.InSequence(s1);
|
||||||
|
EXPECT_CALL(my_mock, Describe())
|
||||||
|
.InSequence(s2);
|
||||||
|
```
|
||||||
|
|
||||||
|
The `InSequence` clause can be used any number of times on an expectation.
|
||||||
|
|
||||||
|
See also the [`InSequence` class](#InSequence).
|
||||||
|
|
||||||
|
#### After {#EXPECT_CALL.After}
|
||||||
|
|
||||||
|
`.After(`*`expectations...`*`)`
|
||||||
|
|
||||||
|
Specifies that the mock function call is expected to occur after one or more
|
||||||
|
other calls.
|
||||||
|
|
||||||
|
The parameter *`expectations...`* can be up to five
|
||||||
|
[`Expectation`](#Expectation) or [`ExpectationSet`](#ExpectationSet) objects.
|
||||||
|
The mock function call is expected to occur after all of the given expectations.
|
||||||
|
|
||||||
|
For example, the following code sets the expectation that the `Describe()`
|
||||||
|
method of `my_mock` is called only after both `InitX()` and `InitY()` have been
|
||||||
|
called.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::Expectation;
|
||||||
|
...
|
||||||
|
Expectation init_x = EXPECT_CALL(my_mock, InitX());
|
||||||
|
Expectation init_y = EXPECT_CALL(my_mock, InitY());
|
||||||
|
EXPECT_CALL(my_mock, Describe())
|
||||||
|
.After(init_x, init_y);
|
||||||
|
```
|
||||||
|
|
||||||
|
The `ExpectationSet` object is helpful when the number of prerequisites for an
|
||||||
|
expectation is large or variable, for example:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::ExpectationSet;
|
||||||
|
...
|
||||||
|
ExpectationSet all_inits;
|
||||||
|
// Collect all expectations of InitElement() calls
|
||||||
|
for (int i = 0; i < element_count; i++) {
|
||||||
|
all_inits += EXPECT_CALL(my_mock, InitElement(i));
|
||||||
|
}
|
||||||
|
EXPECT_CALL(my_mock, Describe())
|
||||||
|
.After(all_inits); // Expect Describe() call after all InitElement() calls
|
||||||
|
```
|
||||||
|
|
||||||
|
The `After` clause can be used any number of times on an expectation.
|
||||||
|
|
||||||
|
#### WillOnce {#EXPECT_CALL.WillOnce}
|
||||||
|
|
||||||
|
`.WillOnce(`*`action`*`)`
|
||||||
|
|
||||||
|
Specifies the mock function's actual behavior when invoked, for a single
|
||||||
|
matching function call.
|
||||||
|
|
||||||
|
The parameter *`action`* represents the
|
||||||
|
[action](../gmock_for_dummies.md#actions-what-should-it-do) that the function
|
||||||
|
call will perform. See the [Actions Reference](actions.md) for a list of
|
||||||
|
built-in actions.
|
||||||
|
|
||||||
|
The use of `WillOnce` implicitly sets a cardinality on the expectation when
|
||||||
|
`Times` is not specified. See [`Times`](#EXPECT_CALL.Times).
|
||||||
|
|
||||||
|
Each matching function call will perform the next action in the order declared.
|
||||||
|
For example, the following code specifies that `my_mock.GetNumber()` is expected
|
||||||
|
to be called exactly 3 times and will return `1`, `2`, and `3` respectively on
|
||||||
|
the first, second, and third calls:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::Return;
|
||||||
|
...
|
||||||
|
EXPECT_CALL(my_mock, GetNumber())
|
||||||
|
.WillOnce(Return(1))
|
||||||
|
.WillOnce(Return(2))
|
||||||
|
.WillOnce(Return(3));
|
||||||
|
```
|
||||||
|
|
||||||
|
The `WillOnce` clause can be used any number of times on an expectation.
|
||||||
|
|
||||||
|
#### WillRepeatedly {#EXPECT_CALL.WillRepeatedly}
|
||||||
|
|
||||||
|
`.WillRepeatedly(`*`action`*`)`
|
||||||
|
|
||||||
|
Specifies the mock function's actual behavior when invoked, for all subsequent
|
||||||
|
matching function calls. Takes effect after the actions specified in the
|
||||||
|
[`WillOnce`](#EXPECT_CALL.WillOnce) clauses, if any, have been performed.
|
||||||
|
|
||||||
|
The parameter *`action`* represents the
|
||||||
|
[action](../gmock_for_dummies.md#actions-what-should-it-do) that the function
|
||||||
|
call will perform. See the [Actions Reference](actions.md) for a list of
|
||||||
|
built-in actions.
|
||||||
|
|
||||||
|
The use of `WillRepeatedly` implicitly sets a cardinality on the expectation
|
||||||
|
when `Times` is not specified. See [`Times`](#EXPECT_CALL.Times).
|
||||||
|
|
||||||
|
If any `WillOnce` clauses have been specified, matching function calls will
|
||||||
|
perform those actions before the action specified by `WillRepeatedly`. See the
|
||||||
|
following example:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::Return;
|
||||||
|
...
|
||||||
|
EXPECT_CALL(my_mock, GetName())
|
||||||
|
.WillRepeatedly(Return("John Doe")); // Return "John Doe" on all calls
|
||||||
|
|
||||||
|
EXPECT_CALL(my_mock, GetNumber())
|
||||||
|
.WillOnce(Return(42)) // Return 42 on the first call
|
||||||
|
.WillRepeatedly(Return(7)); // Return 7 on all subsequent calls
|
||||||
|
```
|
||||||
|
|
||||||
|
The `WillRepeatedly` clause can be used at most once on an expectation.
|
||||||
|
|
||||||
|
#### RetiresOnSaturation {#EXPECT_CALL.RetiresOnSaturation}
|
||||||
|
|
||||||
|
`.RetiresOnSaturation()`
|
||||||
|
|
||||||
|
Indicates that the expectation will no longer be active after the expected
|
||||||
|
number of matching function calls has been reached.
|
||||||
|
|
||||||
|
The `RetiresOnSaturation` clause is only meaningful for expectations with an
|
||||||
|
upper-bounded cardinality. The expectation will *retire* (no longer match any
|
||||||
|
function calls) after it has been *saturated* (the upper bound has been
|
||||||
|
reached). See the following example:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::_;
|
||||||
|
using ::testing::AnyNumber;
|
||||||
|
...
|
||||||
|
EXPECT_CALL(my_mock, SetNumber(_)) // Expectation 1
|
||||||
|
.Times(AnyNumber());
|
||||||
|
EXPECT_CALL(my_mock, SetNumber(7)) // Expectation 2
|
||||||
|
.Times(2)
|
||||||
|
.RetiresOnSaturation();
|
||||||
|
```
|
||||||
|
|
||||||
|
In the above example, the first two calls to `my_mock.SetNumber(7)` match
|
||||||
|
expectation 2, which then becomes inactive and no longer matches any calls. A
|
||||||
|
third call to `my_mock.SetNumber(7)` would then match expectation 1. Without
|
||||||
|
`RetiresOnSaturation()` on expectation 2, a third call to `my_mock.SetNumber(7)`
|
||||||
|
would match expectation 2 again, producing a failure since the limit of 2 calls
|
||||||
|
was exceeded.
|
||||||
|
|
||||||
|
The `RetiresOnSaturation` clause can be used at most once on an expectation and
|
||||||
|
must be the last clause.
|
||||||
|
|
||||||
|
### ON_CALL {#ON_CALL}
|
||||||
|
|
||||||
|
`ON_CALL(`*`mock_object`*`,`*`method_name`*`(`*`matchers...`*`))`
|
||||||
|
|
||||||
|
Defines what happens when the method *`method_name`* of the object
|
||||||
|
*`mock_object`* is called with arguments that match the given matchers
|
||||||
|
*`matchers...`*. Requires a modifier clause to specify the method's behavior.
|
||||||
|
*Does not* set any expectations that the method will be called.
|
||||||
|
|
||||||
|
The parameter *`matchers...`* is a comma-separated list of
|
||||||
|
[matchers](../gmock_for_dummies.md#matchers-what-arguments-do-we-expect) that
|
||||||
|
correspond to each argument of the method *`method_name`*. The `ON_CALL`
|
||||||
|
specification will apply only to calls of *`method_name`* whose arguments match
|
||||||
|
all of the matchers. If `(`*`matchers...`*`)` is omitted, the behavior is as if
|
||||||
|
each argument's matcher were a [wildcard matcher (`_`)](matchers.md#wildcard).
|
||||||
|
See the [Matchers Reference](matchers.md) for a list of all built-in matchers.
|
||||||
|
|
||||||
|
The following chainable clauses can be used to set the method's behavior, and
|
||||||
|
they must be used in the following order:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
ON_CALL(mock_object, method_name(matchers...))
|
||||||
|
.With(multi_argument_matcher) // Can be used at most once
|
||||||
|
.WillByDefault(action); // Required
|
||||||
|
```
|
||||||
|
|
||||||
|
See details for each modifier clause below.
|
||||||
|
|
||||||
|
#### With {#ON_CALL.With}
|
||||||
|
|
||||||
|
`.With(`*`multi_argument_matcher`*`)`
|
||||||
|
|
||||||
|
Restricts the specification to only mock function calls whose arguments as a
|
||||||
|
whole match the multi-argument matcher *`multi_argument_matcher`*.
|
||||||
|
|
||||||
|
GoogleTest passes all of the arguments as one tuple into the matcher. The
|
||||||
|
parameter *`multi_argument_matcher`* must thus be a matcher of type
|
||||||
|
`Matcher<std::tuple<A1, ..., An>>`, where `A1, ..., An` are the types of the
|
||||||
|
function arguments.
|
||||||
|
|
||||||
|
For example, the following code sets the default behavior when
|
||||||
|
`my_mock.SetPosition()` is called with any two arguments, the first argument
|
||||||
|
being less than the second:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::_;
|
||||||
|
using ::testing::Lt;
|
||||||
|
using ::testing::Return;
|
||||||
|
...
|
||||||
|
ON_CALL(my_mock, SetPosition(_, _))
|
||||||
|
.With(Lt())
|
||||||
|
.WillByDefault(Return(true));
|
||||||
|
```
|
||||||
|
|
||||||
|
GoogleTest provides some built-in matchers for 2-tuples, including the `Lt()`
|
||||||
|
matcher above. See [Multi-argument Matchers](matchers.md#MultiArgMatchers).
|
||||||
|
|
||||||
|
The `With` clause can be used at most once with each `ON_CALL` statement.
|
||||||
|
|
||||||
|
#### WillByDefault {#ON_CALL.WillByDefault}
|
||||||
|
|
||||||
|
`.WillByDefault(`*`action`*`)`
|
||||||
|
|
||||||
|
Specifies the default behavior of a matching mock function call.
|
||||||
|
|
||||||
|
The parameter *`action`* represents the
|
||||||
|
[action](../gmock_for_dummies.md#actions-what-should-it-do) that the function
|
||||||
|
call will perform. See the [Actions Reference](actions.md) for a list of
|
||||||
|
built-in actions.
|
||||||
|
|
||||||
|
For example, the following code specifies that by default, a call to
|
||||||
|
`my_mock.Greet()` will return `"hello"`:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::Return;
|
||||||
|
...
|
||||||
|
ON_CALL(my_mock, Greet())
|
||||||
|
.WillByDefault(Return("hello"));
|
||||||
|
```
|
||||||
|
|
||||||
|
The action specified by `WillByDefault` is superseded by the actions specified
|
||||||
|
on a matching `EXPECT_CALL` statement, if any. See the
|
||||||
|
[`WillOnce`](#EXPECT_CALL.WillOnce) and
|
||||||
|
[`WillRepeatedly`](#EXPECT_CALL.WillRepeatedly) clauses of `EXPECT_CALL`.
|
||||||
|
|
||||||
|
The `WillByDefault` clause must be used exactly once with each `ON_CALL`
|
||||||
|
statement.
|
||||||
|
|
||||||
|
## Classes {#classes}
|
||||||
|
|
||||||
|
GoogleTest defines the following classes for working with mocks.
|
||||||
|
|
||||||
|
### DefaultValue {#DefaultValue}
|
||||||
|
|
||||||
|
`::testing::DefaultValue<T>`
|
||||||
|
|
||||||
|
Allows a user to specify the default value for a type `T` that is both copyable
|
||||||
|
and publicly destructible (i.e. anything that can be used as a function return
|
||||||
|
type). For mock functions with a return type of `T`, this default value is
|
||||||
|
returned from function calls that do not specify an action.
|
||||||
|
|
||||||
|
Provides the static methods `Set()`, `SetFactory()`, and `Clear()` to manage the
|
||||||
|
default value:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
// Sets the default value to be returned. T must be copy constructible.
|
||||||
|
DefaultValue<T>::Set(value);
|
||||||
|
|
||||||
|
// Sets a factory. Will be invoked on demand. T must be move constructible.
|
||||||
|
T MakeT();
|
||||||
|
DefaultValue<T>::SetFactory(&MakeT);
|
||||||
|
|
||||||
|
// Unsets the default value.
|
||||||
|
DefaultValue<T>::Clear();
|
||||||
|
```
|
||||||
|
|
||||||
|
### NiceMock {#NiceMock}
|
||||||
|
|
||||||
|
`::testing::NiceMock<T>`
|
||||||
|
|
||||||
|
Represents a mock object that suppresses warnings on
|
||||||
|
[uninteresting calls](../gmock_cook_book.md#uninteresting-vs-unexpected). The
|
||||||
|
template parameter `T` is any mock class, except for another `NiceMock`,
|
||||||
|
`NaggyMock`, or `StrictMock`.
|
||||||
|
|
||||||
|
Usage of `NiceMock<T>` is analogous to usage of `T`. `NiceMock<T>` is a subclass
|
||||||
|
of `T`, so it can be used wherever an object of type `T` is accepted. In
|
||||||
|
addition, `NiceMock<T>` can be constructed with any arguments that a constructor
|
||||||
|
of `T` accepts.
|
||||||
|
|
||||||
|
For example, the following code suppresses warnings on the mock `my_mock` of
|
||||||
|
type `MockClass` if a method other than `DoSomething()` is called:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::NiceMock;
|
||||||
|
...
|
||||||
|
NiceMock<MockClass> my_mock("some", "args");
|
||||||
|
EXPECT_CALL(my_mock, DoSomething());
|
||||||
|
... code that uses my_mock ...
|
||||||
|
```
|
||||||
|
|
||||||
|
`NiceMock<T>` only works for mock methods defined using the `MOCK_METHOD` macro
|
||||||
|
directly in the definition of class `T`. If a mock method is defined in a base
|
||||||
|
class of `T`, a warning might still be generated.
|
||||||
|
|
||||||
|
`NiceMock<T>` might not work correctly if the destructor of `T` is not virtual.
|
||||||
|
|
||||||
|
### NaggyMock {#NaggyMock}
|
||||||
|
|
||||||
|
`::testing::NaggyMock<T>`
|
||||||
|
|
||||||
|
Represents a mock object that generates warnings on
|
||||||
|
[uninteresting calls](../gmock_cook_book.md#uninteresting-vs-unexpected). The
|
||||||
|
template parameter `T` is any mock class, except for another `NiceMock`,
|
||||||
|
`NaggyMock`, or `StrictMock`.
|
||||||
|
|
||||||
|
Usage of `NaggyMock<T>` is analogous to usage of `T`. `NaggyMock<T>` is a
|
||||||
|
subclass of `T`, so it can be used wherever an object of type `T` is accepted.
|
||||||
|
In addition, `NaggyMock<T>` can be constructed with any arguments that a
|
||||||
|
constructor of `T` accepts.
|
||||||
|
|
||||||
|
For example, the following code generates warnings on the mock `my_mock` of type
|
||||||
|
`MockClass` if a method other than `DoSomething()` is called:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::NaggyMock;
|
||||||
|
...
|
||||||
|
NaggyMock<MockClass> my_mock("some", "args");
|
||||||
|
EXPECT_CALL(my_mock, DoSomething());
|
||||||
|
... code that uses my_mock ...
|
||||||
|
```
|
||||||
|
|
||||||
|
Mock objects of type `T` by default behave the same way as `NaggyMock<T>`.
|
||||||
|
|
||||||
|
### StrictMock {#StrictMock}
|
||||||
|
|
||||||
|
`::testing::StrictMock<T>`
|
||||||
|
|
||||||
|
Represents a mock object that generates test failures on
|
||||||
|
[uninteresting calls](../gmock_cook_book.md#uninteresting-vs-unexpected). The
|
||||||
|
template parameter `T` is any mock class, except for another `NiceMock`,
|
||||||
|
`NaggyMock`, or `StrictMock`.
|
||||||
|
|
||||||
|
Usage of `StrictMock<T>` is analogous to usage of `T`. `StrictMock<T>` is a
|
||||||
|
subclass of `T`, so it can be used wherever an object of type `T` is accepted.
|
||||||
|
In addition, `StrictMock<T>` can be constructed with any arguments that a
|
||||||
|
constructor of `T` accepts.
|
||||||
|
|
||||||
|
For example, the following code generates a test failure on the mock `my_mock`
|
||||||
|
of type `MockClass` if a method other than `DoSomething()` is called:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::StrictMock;
|
||||||
|
...
|
||||||
|
StrictMock<MockClass> my_mock("some", "args");
|
||||||
|
EXPECT_CALL(my_mock, DoSomething());
|
||||||
|
... code that uses my_mock ...
|
||||||
|
```
|
||||||
|
|
||||||
|
`StrictMock<T>` only works for mock methods defined using the `MOCK_METHOD`
|
||||||
|
macro directly in the definition of class `T`. If a mock method is defined in a
|
||||||
|
base class of `T`, a failure might not be generated.
|
||||||
|
|
||||||
|
`StrictMock<T>` might not work correctly if the destructor of `T` is not
|
||||||
|
virtual.
|
||||||
|
|
||||||
|
### Sequence {#Sequence}
|
||||||
|
|
||||||
|
`::testing::Sequence`
|
||||||
|
|
||||||
|
Represents a chronological sequence of expectations. See the
|
||||||
|
[`InSequence`](#EXPECT_CALL.InSequence) clause of `EXPECT_CALL` for usage.
|
||||||
|
|
||||||
|
### InSequence {#InSequence}
|
||||||
|
|
||||||
|
`::testing::InSequence`
|
||||||
|
|
||||||
|
An object of this type causes all expectations encountered in its scope to be
|
||||||
|
put in an anonymous sequence.
|
||||||
|
|
||||||
|
This allows more convenient expression of multiple expectations in a single
|
||||||
|
sequence:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::InSequence;
|
||||||
|
{
|
||||||
|
InSequence seq;
|
||||||
|
|
||||||
|
// The following are expected to occur in the order declared.
|
||||||
|
EXPECT_CALL(...);
|
||||||
|
EXPECT_CALL(...);
|
||||||
|
...
|
||||||
|
EXPECT_CALL(...);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The name of the `InSequence` object does not matter.
|
||||||
|
|
||||||
|
### Expectation {#Expectation}
|
||||||
|
|
||||||
|
`::testing::Expectation`
|
||||||
|
|
||||||
|
Represents a mock function call expectation as created by
|
||||||
|
[`EXPECT_CALL`](#EXPECT_CALL):
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::Expectation;
|
||||||
|
Expectation my_expectation = EXPECT_CALL(...);
|
||||||
|
```
|
||||||
|
|
||||||
|
Useful for specifying sequences of expectations; see the
|
||||||
|
[`After`](#EXPECT_CALL.After) clause of `EXPECT_CALL`.
|
||||||
|
|
||||||
|
### ExpectationSet {#ExpectationSet}
|
||||||
|
|
||||||
|
`::testing::ExpectationSet`
|
||||||
|
|
||||||
|
Represents a set of mock function call expectations.
|
||||||
|
|
||||||
|
Use the `+=` operator to add [`Expectation`](#Expectation) objects to the set:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using ::testing::ExpectationSet;
|
||||||
|
ExpectationSet my_expectations;
|
||||||
|
my_expectations += EXPECT_CALL(...);
|
||||||
|
```
|
||||||
|
|
||||||
|
Useful for specifying sequences of expectations; see the
|
||||||
|
[`After`](#EXPECT_CALL.After) clause of `EXPECT_CALL`.
|
Loading…
x
Reference in New Issue
Block a user