Welcome to the next pikoTutorial!
To ensure a certain order of function calls, GTest provides 2 ways to do that:
InSequenceobjectSequenceobject
InSequence object
The simplest way to expect specific function call order is to create a InSequence object in dedicated scope:
C++
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using namespace ::testing;
struct SomeInterface
{
virtual ~SomeInterface() = default;
virtual void FirstMethod() = 0;
virtual void SecondMethod() = 0;
virtual void ThirdMethod() = 0;
virtual void FourthMethod() = 0;
};
struct SomeMock : public SomeInterface
{
MOCK_METHOD(void, FirstMethod, (), (override));
MOCK_METHOD(void, SecondMethod, (), (override));
MOCK_METHOD(void, ThirdMethod, (), (override));
MOCK_METHOD(void, FourthMethod, (), (override));
};
void SomeFunctionToTest(SomeInterface &obj)
{
obj.FirstMethod();
obj.SecondMethod();
obj.ThirdMethod();
obj.FourthMethod();
}
TEST(TestSomeFunction, CallingOrderIsCorrect)
{
SomeMock obj;
{
// in this scope the call order matters...
InSequence seq;
EXPECT_CALL(obj, FirstMethod);
EXPECT_CALL(obj, SecondMethod);
}
// ...and outside of the scope it doesn't
EXPECT_CALL(obj, FourthMethod);
EXPECT_CALL(obj, ThirdMethod);
SomeFunctionToTest(obj);
}Sequence object
To gain some flexibility, you can create a dedicated Sequence object which then can be passed when calling EXPECT_CALL macro or to any other function as an input argument:
C++
TEST(TestSomeFunction, CallingOrderIsCorrect)
{
SomeMock obj;
Sequence seq;
// these functions must be called in order...
EXPECT_CALL(obj, FirstMethod).InSequence(seq);
EXPECT_CALL(obj, SecondMethod).InSequence(seq);
// ...and these not necessarly
EXPECT_CALL(obj, FourthMethod);
EXPECT_CALL(obj, ThirdMethod);
SomeFunctionToTest(obj);
}Read also:
- GTest and short-circuit evaluation in C++
- AI is powerful. Snippets are instant.
- From AUTOSAR to S-Core: the first C++ pub/sub implementation
- How to write Arduino Uno code with Python?
- Combining Bazel with Docker
- Running commands with timeout on Linux
- Running Python unit tests with CMake
- Thirdparty dependencies with FetchContent
- Bug of the week #11
- Combining CMake with Docker
- How to search the internet from Linux terminal?
- Folding expressions in C++
- How to derive from an enum in Python?
- Bug of the week #10
- Trying ROS2: client/server within a single container
- Make C++ a better place #4: Go as an alternative
- How to convert hex to dec in Linux terminal?
- Setting up a Python project with CMake
- Separating builds for different configs with Bazel
- Trying ROS2: pub/sub within a single container
- Bug of the week #9
- UDP multicasting with Python
- Destruction order vs thread safety in C++
- Let’s review some code: C++ #2
- Make C++ a better place #3: D as an alternative
- Registering callback using std::function in C++
- Bug of the week #8
- TCP client/server with Python
- Simple menus in Bash scripts with select
- Calling member function on a nullptr in C++
- Bug of the week #7
- Python lru_cache explained
- How to dockerize a Python application?
- Make C++ a better place #2: CppFront as an alternative
- Parameters combinations in GoogleTest
- Data transfer with curl
- Python reduce explained
- Bug of the week #6
- Custom literals in C++
- Linux and hash command
- 5 Python good practices which make life easier
- Let’s review some code: Python #1
- Make C++ a better place #1: What does better mean
- Enums vs enum class in C++
- Bug of the week #5
- UDP client/server with Python
- Hard links in Linux
- Functions calling order in unit tests in C++
- Bug of the week #4
- Yield in Python – state machines, coroutines and more
- Copy files from another branch with Git
- Make C++ a better place #0: Introduction
- 5 misconceptions about std::move in C++
- How to use xargs on Linux?
- How to test method call order with unittest in Python?
- Bug of the week #3
- Build & run C++ unit tests with CMake
- Arrange text with sort on Linux
- Key derivation function with Python
- Let’s review some code #1: C++









