1

CppUTest 文档说

MockSupportPlugin 使使用模拟的工作更容易。它会自动为您完成以下工作:

  • 每次测试结束时的 checkExpectations(在全局范围内,在所有范围内递归)
  • 在每次测试结束时清除所有期望
  • 安装在每次测试开始时在插件中配置的所有比较器
  • 在每次测试结束时删除所有比较器

参考: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;

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

4

1 回答 1

0

模拟类型比较器将用于您的模拟比较。

例如,您需要比较一个 type 的结构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";
    }
};

接下来,在您的测试组中,您需要将这些比较器安装在setupteardown清除它们:

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.
于 2020-03-30T08:31:07.670 回答