C++ 如何在CppUTest中使用MockSupportPlugin自动执行检查期望?

C++ 如何在CppUTest中使用MockSupportPlugin自动执行检查期望?,c++,cpputest,C++,Cpputest,CppUTest文档说 MockSupportPlugin使使用Mock更容易。它会自动为您执行以下工作: 在每个测试结束时检查期望值(在全局范围上,在所有范围上递归) 在每次测试结束时清除所有期望值 在每次测试开始时安装插件中配置的所有比较器 在每次测试结束时移除所有比较器 参考: 我尝试了以下示例: #include "CppUTest/TestRegistry.h" #include "CppUTestExt/MockSupportPlugin.h" MyDummyComparato

CppUTest文档说

MockSupportPlugin使使用Mock更容易。它会自动为您执行以下工作:

  • 在每个测试结束时检查期望值(在全局范围上,在所有范围上递归)
  • 在每次测试结束时清除所有期望值
  • 在每次测试开始时安装插件中配置的所有比较器
  • 在每次测试结束时移除所有比较器
参考:

我尝试了以下示例:

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

MyDummyComparator dummyComparator;
MockSupportPlugin mockPlugin;

mockPlugin.installComparator("MyDummyType", dummyComparator);
TestRegistry::getCurrentRegistry()->installPlugin(&mockPlugin);
使用我添加的MyDummComparator:

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

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

但是当我从测试中删除expectOneCall()或expectNCalls()时,它显示测试失败。如何使用CPPUTest中的MockSupportPlugin自动执行“每个测试结束时的检查预期(在全局范围内,在所有范围内递归)”?

模拟比较中将使用模拟类型比较器

例如,您需要比较类型为
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";
    }
};
您可以这样定义比较器:

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";
    }
};
接下来,在测试组中,您需要在
设置中安装这些比较器,并在
拆卸中清除它们:

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();
    }
};
接下来,您可以使用此比较器,使用
with ParameterOfType
函数如下:

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

模拟类型比较器将用于模拟比较

例如,您需要比较类型为
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";
    }
};
您可以这样定义比较器:

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";
    }
};
接下来,在测试组中,您需要在
设置中安装这些比较器,并在
拆卸中清除它们:

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();
    }
};
接下来,您可以使用此比较器,使用
with ParameterOfType
函数如下:

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

每个模拟都需要比较器吗?对于特定的
类型
,需要比较器。一旦安装了comparator,您可以在每次需要比较
类型时使用它。我希望使用comparator可以避免重复调用expectOneCall和ExpectnCall,但情况似乎并非如此。实际上,我不知道比较器是用来做什么的,比如真正要比较的是什么?比较器是在需要比较模拟中的
参数类型
时使用的。我需要为每个模拟使用比较器吗?你需要为特定的
类型
使用比较器。一旦安装了comparator,您可以在每次需要比较
类型时使用它。我希望使用comparator可以避免重复调用expectOneCall和ExpectnCall,但情况似乎并非如此。我不知道比较器到底是用来做什么的,比如我们真正要比较的是什么?比较器是当你需要在模拟中比较
ParameterOfType
时使用的。