blob: fd82d95f2cd58308208c95b1bfb7c4470c68d4df [file] [log] [blame]
CppUMock
========
CppUMock is the built-in mocking system of CppUTest. This chapter describes the basic features of the system. For details please
refer the `official CppUMock manual`_.
System functions
----------------
Checking expectations
^^^^^^^^^^^^^^^^^^^^^
After defining expected calls an invoking actual call the test should check if all the expected calls have happened. This can be
done by calling ``mock().checkExpectations()``. The common place to put this function call is the ``TEST_TEARDOWN`` function of
the test group.
Resetting mocking system
^^^^^^^^^^^^^^^^^^^^^^^^
After the last interaction with the mocking system the developer should reset the state of the system by calling
``mock().clear()``. The common place to put this function call is the ``TEST_TEARDOWN`` function of the test group after calling
``mock().checkExpectations()``.
Namespaces
^^^^^^^^^^
All interactions with the mocking system start by calling ``mock()``. This function has an option ``name`` string parameter
which can be used for limiting the scope of the mocking operation.
.. code-block:: C++
mock("bl1").expectOneCall("bl1_main");
Enable/disable
^^^^^^^^^^^^^^
The mocking system can be enabled/disabled runtime using the functions below. This causes call expected and actual call to be
ignored. Default settings are restored by ``mock().clear()``.
- ``enable()``
- ``disable()``
.. code-block:: C++
mock().disable();
// All CppUMock calls are ignored after this point
mock().enable();
// CppUMock calls are working again
mock().disable();
// All CppUMock calls are ignored after this point
[...]
mock().clear();
// Default settings are restored
String order
^^^^^^^^^^^^
After defining multiple expected function call the mocking system always The mocking system always uses the next matching
function when an actual call happens but by default it doesn't check if different function calls happen in the order of
definition. This behaviour can be turned on using the ``mock().strictOrder()`` function. This option is also set to default by
the ``mock().clear()`` function.
.. code-block:: C++
mock().expectOneCall("A");
mock().expectOneCall("B");
mock().actualCall("B");
mock().actualCall("A");
// No error
mock().strictOrder();
mock().expectOneCall("A");
mock().expectOneCall("B");
mock().actualCall("B"); // Error generated here
mock().actualCall("A");
Ignoring unspecified calls
^^^^^^^^^^^^^^^^^^^^^^^^^^
If there are addition actual calls happening in the test case which are unrelated to the test case (i.e. log or other messages)
the unspecified calls can be ignored by adding ``mock().ignoreOtherCalls()`` to the test case. This function should be used
carefully because it can hide unexpected call which are indicating errors in the code. The affect of this call ends by calling
``mock().clear()``.
Specifying object
-----------------
In object oriented environment member function should validate if the function call happened on the suitable object. This is
done by adding the following function to the mock specification.
- ``onObject(objectPtr)``
Validating parameters
---------------------
Each supported parameter type has a corresponding function. These are the same
in the expected and actual calls.
- ``withBoolParameter(name, bool value)``
- ``withIntParameter(name, int value)``
- ``withUnsignedIntParameter(name, unsigned int value)``
- ``withLongIntParameter(name, long int value)``
- ``withUnsignedLongIntParameter(name, unsigned long int value)``
- ``withDoubleParameter(name, double value)``
- ``withStringParameter(name, const char* value)``
- ``withPointerParameter(name, void* value)``
- ``withFunctionPointerParameter(name, void (*value)())``
- ``withConstPointerParameter(name, const void* value)``
- ``withMemoryBufferParameter(name, const unsigned char* value, size_t size)``
If custum types are defined and copier/comparator objects were installed the following function can handle these parameters.
- ``withParameterOfType(typeName, name, value)``
There's an option to copying data from the test environment into the mock function. When setting expectations the following
function can be used to set the pointer and the address of the data. **The mocking system will not create a copy of this data**
so the original data should be kept intact until the actual call happens.
- ``withOutputParameterReturning(name, value, size)``
- ``withOutputParameterOfTypeReturning(typeName, name, value)``
In the actual call the pair of these function are shown below.
- ``withOutputParameter(name, output)``
- ``withOutputParameterOfType(typeName, name, output)``
Ignoring parameters
^^^^^^^^^^^^^^^^^^^
There are cases when the developer doesn't want to specify all parameters. The following function can set this behaviour in the
expected call.
- ``ignoreOtherParameters()``
Specifying return values
------------------------
Using function name overloading the return values are specified by calling ``andReturnValue`` and the parameter type will
determine the exact function.
- ``andReturnValue(bool value)``
- ``andReturnValue(int value)``
- ``andReturnValue(unsigned int value)``
- ``andReturnValue(long int value)``
- ``andReturnValue(unsigned long int value)``
- ``andReturnValue(double value)``
- ``andReturnValue(const char* value)``
- ``andReturnValue(void* value)``
- ``andReturnValue(const void* value)``
- ``andReturnValue(void (*value)())``
Returning value in actual calls
-------------------------------
All of these function have version with ``OrDefault(type default_value)`` suffix. These version return a default value if the
return value was not specified in the expected call.
- ``bool returnBoolValue()``
- ``int returnIntValue()``
- ``unsigned int returnUnsignedIntValue()``
- ``long int returnLongIntValue()``
- ``unsigned long int returnUnsignedLongIntValue()``
- ``double returnDoubleValue()``
- ``const char * returnStringValue()``
- ``void * returnPointerValue()``
- ``const void * returnConstPointerValue()``
- ``void (*returnFunctionPointerValue())()``
Debugging CppUMock errors
-------------------------
Debugging CppUMock errors can be hard unlike assertion errors because a mocking failure can happen multiple layers of function
calls under the test case. The mocking system has a very similar feature to CppUTest's ``UT_CRASH()`` which is
``mock().crashOnFailure()``. By enabling this feature the code will crash on mocking errors and the developer could easily catch
it with the debugger.
--------------
*Copyright (c) 2019-2021, Arm Limited. All rights reserved.*
.. _`official CppUMock manual`: https://cpputest.github.io/mocking_manual.html