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