Defining a Mock Class
Mocking a Normal Class
Given
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;
};
int * count
Definition gmock_stress_test.cc:90
(note that ~Foo() must be virtual) we can define its mock as
class MockFoo : public Foo {
public:
MOCK_METHOD(
string, Describe, (
const char* name), (
override));
};
#define MOCK_METHOD(...)
Definition gmock-function-mocker.h:111
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:
using ::testing::NiceMock;
using ::testing::NaggyMock;
using ::testing::StrictMock;
NiceMock<MockFoo> nice_foo;
NaggyMock<MockFoo> naggy_foo;
StrictMock<MockFoo> strict_foo;
{: .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
Class templates can be mocked just like any class.
To mock
template <typename Elem>
class StackInterface {
public:
virtual ~StackInterface();
virtual int GetSize() const = 0;
virtual void Push(
const Elem&
x) = 0;
};
int x
Definition gmock-matchers-containers_test.cc:376
(note that all member functions that are mocked, including ~StackInterface() must be virtual).
template <typename Elem>
class MockStack : public StackInterface<Elem> {
public:
};
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,
MOCK_METHOD(
bool, Foo, (
int n), (Calltype(STDMETHODCALLTYPE)));
(const, Calltype(STDMETHODCALLTYPE)));
const double y
Definition gmock-matchers-containers_test.cc:377
where STDMETHODCALLTYPE is defined by <objbase.h> on Windows.
Using Mocks in Tests
The typical work flow is:
- Import the gMock names you need to use. All gMock symbols are in the
testing namespace unless they are macros or otherwise noted.
- Create the mock objects.
- Optionally, set the default actions of the mock objects.
- Set your expectations on the mock objects (How will they be called? What will they do?).
- Exercise code that uses the mock objects; if necessary, check the result using googletest assertions.
- When a mock object is destructed, gMock automatically verifies that all expectations on it have been satisfied.
Here's an example:
using ::testing::Return;
TEST(BarTest, DoesThis) {
.WillByDefault(Return(1));
.Times(3)
.WillRepeatedly(Return("Category 5"));
}
#define EXPECT_CALL(obj, call)
Definition gmock-spec-builders.h:2145
#define ON_CALL(obj, call)
Definition gmock-spec-builders.h:2142
#define EXPECT_EQ(val1, val2)
Definition gtest.h:1868
#define TEST(test_suite_name, test_name)
Definition gtest.h:2176
Definition googletest-output-test_.cc:471
Setting Default Actions
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>. For example:
DefaultValue<std::unique_ptr<Buzz>>::SetFactory(
[] { return std::make_unique<Buzz>(AccessLevel::kInternal); });
EXPECT_CALL(mock_buzzer_, MakeBuzz(
"hello")).Times(AnyNumber());
auto buzz1 = mock_buzzer_.MakeBuzz("hello");
auto buzz2 = mock_buzzer_.MakeBuzz("hello");
DefaultValue<std::unique_ptr<Buzz>>::Clear();
#define EXPECT_NE(val1, val2)
Definition gtest.h:1870
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, but it is used for setting default behaviors when you do not require that the mock method is called. See Knowing When to Expect for a more detailed discussion.
Setting Expectations
See EXPECT_CALL in the Mocking Reference.
Matchers
See the Matchers Reference.
Actions
See the Actions Reference.
Cardinalities
See the Times clause 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 or InSequence clause of EXPECT_CALL, or use an InSequence object.
Verifying and Resetting a Mock
gMock will verify the expectations on a mock object when it is destructed, or you can do it earlier:
using ::testing::Mock;
...
Mock::VerifyAndClearExpectations(&mock_obj);
...
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 for more information.
You can also tell gMock that a mock object can be leaked and doesn't need to be verified:
Mock::AllowLeak(&mock_obj);
Mock Classes
gMock defines a convenient mock class template
class MockFunction<R(A1, ..., An)> {
public:
};
See this recipe 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. |