这两天在用gtest对类进行测试的时候,发现了一些问题,目前最麻烦的大概就是对protected的函数进行测试了。
一开始,在查资料的时候,查到的解决方案大概都是以下两个:
- 使用FRIEND_TEST,把测试类(或函数)作为友元类(或函数)添加到被测类里,这样就可以访问protected/private了。但是这种方法要改动原工程的内容,并不是一个好的解决方法,所以舍弃了这种方法。
namespace my_namespace {
class Foo {
friend class FooTest;
FRIEND_TEST(FooTest, Bar);
FRIEND_TEST(FooTest, Baz);
...
definition of the class Foo
...
};
} // namespace my_namespace
像这种被测类在命名空间里的,测试类也要放在my_namespace命名空间中
namespace my_namespace {
class FooTest : public ::testing::Test {
protected:
...
};
TEST_F(FooTest, Bar) { ... }
TEST_F(FooTest, Baz) { ... }
} // namespace my_namespace
- 被测试的源文件不需要任何修改,只要定义下面有个头文件CxxTestDefs.h,然后在测试类的.cpp文件中#include "CxxTestDefs.h"就可以了。在测试类的.cpp文件中,#include "CxxTestDefs.h"必须放在被测试类的#include行的上面,这样被测试类中的private, protected关键字就会被替换成public,测试类就能访问了。
- 然而这一种方法在vs2008中行不通,加上这些代码,会使得gtest本身的函数无法识别,所以这种方法舍弃。
#ifndef __CXX_TEST_H__
#define __CXX_TEST_H__
#define private public
#define protected public
#endif //__CXX_TEST_H__
之后考虑了一下,如果只是对protected的成员函数进行测试,测试类可以直接继承被测类,这样就可以调用protected的成员函数了。
class FooTest:public testing::Test,Foo{
protected:
static void SetUpTestCase() {
......
}
static void TearDownTestCase() {
......
}
static Foo m_foo;
};
但是这个也是有一点问题,就是如果被测类没有默认的构造函数,但有带参数的构造函数的时候,也会报错:error C2512:"FooTest":no appropriate default constructor available
这一问题目前还没有找到解决方案……
网友评论