我正在做一个大型的C++项目,对于安全关键的航空航天软件,我们有大约50名开发人员在这个项目上工作,所以这个项目当然是巨大的,我们在Red Hat Linux上使用C++,并使用了一点Java和Python,而且系统的一小部分托管在IBM AIX Unix和Windows上。
我最近受雇于这个项目,发现UnitTest++被用来做单元测试。有一件事让我感到困惑,那就是UnitTest++是如何使用宏的。它使用宏定义派生类,然后调用宏调用基类方法。这是非常不寻常的,我试图在一个小的示例C++程序中重现相同的东西,但无法使其工作。注意示例程序的源代码。我不能在我们的项目中张贴的具体代码,因为保密协议。
应该有一种方法可以让它工作,它可以在我们的单元测试中使用UnitTest++
// macro2.cpp
#include <iostream>
using namespace std;
class TestBaseClass
{
public:
// class constructor
TestBaseClass() : num1(3), num2(8)
{
cout << "Object Created" << endl;
}
// class properties
int num1;
int num2;
// class method
void testMethod()
{
cout << "testMethod() called" << endl;
}
// class destructor
~TestBaseClass()
{
cout << "Object Destroyed" << endl;
}
};
#define TEST_MACRO(TestBaseClass) \
class TestDerivedClass : public TestBaseClass \
{ \
public: \
TestDerivedClass() { num1 = 10; } \
}; \
int main()
{
// call macro base class method
TEST_MACRO(TestBaseClass)
{
testMethod();
}
return 0;
}发布于 2019-11-15 02:01:44
免责声明:不是100%确定UnitTest++是如何做到这一点的,但是Boost单元测试似乎也在做同样的事情,而且我想不出任何其他可以做到的事情。
解决方案是在类TestDerivedClass中使用方法签名结束TEST_MACRO,这样后面的作用域({ //call to things within TestDerivedClass})就可以作为该方法的实现。
因为你不能在一个函数作用域中声明一个类,所以你还需要通过一些其他的结构来调用这个方法(例如,Boost单元测试也会通过宏生成main方法)
下面是一个有效的示例:
#include <iostream>
using namespace std;
class TestBaseClass
{
public:
// class constructor
TestBaseClass() : num1(3), num2(8)
{
cout << "Object Created" << endl;
}
// class properties
int num1;
int num2;
// class method
void testMethod()
{
cout << "testMethod() called" << endl;
}
// class destructor
~TestBaseClass()
{
cout << "Object Destroyed" << endl;
}
};
#define TEST_MACRO(TestBaseClass) \
class TestDerivedClass : public TestBaseClass \
{ \
public: \
TestDerivedClass() { num1 = 10; } \
void testMethodInternal(); \
}; \
\
void TestDerivedClass::testMethodInternal()
// call macro base class method
TEST_MACRO(TestBaseClass)
{
testMethod();
}
int main()
{
TestDerivedClass inst;
inst.testMethodInternal();
return 0;
}https://stackoverflow.com/questions/58862779
复制相似问题