Как использовать MockSupportPlugin в CppUTest для автоматического выполнения checkExpectations? - PullRequest
0 голосов
/ 27 марта 2020

Документация CppUTest гласит:

MockSupportPlugin облегчает работу с макетами. Он автоматически выполняет следующую работу:

  • checkExpectations в конце каждого теста (в глобальной области видимости, рекурсивный для всех областей)
  • очистить все ожидания в конце каждый тест
  • установить все компараторы, которые были настроены в плагине в начале каждого теста
  • удалить все компараторы в конце каждого теста

ref: https://cpputest.github.io/plugin_manual.html

Я попробовал следующий пример:

#include "CppUTest/TestRegistry.h"
#include "CppUTestExt/MockSupportPlugin.h"

MyDummyComparator dummyComparator;
MockSupportPlugin mockPlugin;

mockPlugin.installComparator("MyDummyType", dummyComparator);
TestRegistry::getCurrentRegistry()->installPlugin(&mockPlugin);

с моим добавленным MYDummyComparator:

class MyDummyComparator : public MockNamedValueComparator
{
   bool isEqual( const void *object1, const void *object2 )
   {
      return object1 == object2;
   }

   SimpleString valueToString( const void *object )
   {
      return SimpleString();
   }
} dummyComparator;

Но когда я удаляю waitOneCall () или waitNCalls () из моих тестов, показывает, что тесты не пройдены. Как использовать MockSupportPlugin из CPPUTest, чтобы автоматически выполнять «checkExpectations в конце каждого теста (в глобальной области действия, которая рекурсивна во всех областях)»?

1 Ответ

0 голосов
/ 30 марта 2020

В ваших ложных сравнениях будут использоваться компараторы типов.

Например, вам нужно сравнить структуру типа Point, которая выглядит следующим образом:

struct Point {
    int    x;
    int    y;
};

Вы бы определили свой компаратор следующим образом:

class PointTypeComparator : public MockNamedValueComparator
{
public:
    bool isEqual(const void* object1, const void* object2) override
    {
        // Casting here the void pointers to the type to compare
        const auto *pointObject1 = (const Point *) object1; 
        const auto *pointObject2 = (const Point *) object2;

        // Perform comparison, in this case, comparing x and y
        return ((pointObject1->x == pointObject2->x)
                && (pointObject1->y == pointObject2->y);
    }
    virtual SimpleString valueToString(const void* object)
    {
        return (char *) "string";
    }
};

Далее, в вашей группе тестирования вам необходимо установить эти компараторы в setup, а также в teardown очистить их:

TEST_GROUP(MyTest)
{
    void setup()
    {
        PointTypeComparator pointComparator;
        mock().installComparator("Point *", pointComparator);  // Note, its a pointer to a Point type
    }

    void teardown()
    {
        // Call check expectations here, and also clear all comparators after that
        mock().checkExpectations();
        mock().clear();
        mock().removeAllComparatorsAndCopiers();
    }
};

Далее вы можете использовать этот компаратор, используя функцию withParameterOfType как:

mock().expectOneCall("foo")
    .withParameterOfType("Point *", "name", &address); // Here name is the name of variable, and &address is the address of the Point type variable.
...