题
我听说有可能使谷歌测试的TestCase类的朋友到我的班,从而使测试访问我的私人/ protected成员。
如何来实现这一目标?
解决方案
试试这个(直接从谷歌测试文档...):
FRIEND_TEST(TestCaseName, TestName);
例如:
// foo.h
#include <gtest/gtest_prod.h>
// Defines FRIEND_TEST.
class Foo {
...
private:
FRIEND_TEST(FooTest, BarReturnsZeroOnNull);
int Bar(void* x);
};
// foo_test.cc
...
TEST(FooTest, BarReturnsZeroOnNull) {
Foo foo;
EXPECT_EQ(0, foo.Bar(NULL));
// Uses Foo's private member Bar().
}
其他提示
我知道这是旧的,但我今天搜索了相同的答案。 “gtest_prod.h”只是介绍了一个简单的宏来参考测试类。
#define FRIEND_TEST(test_case_name, test_name)\
friend class test_case_name##_##test_name##_Test
所以FRIEND_TEST(FooTest, BarReturnsZeroOnNull);
相当于:
friend class FooTest_BarReturnsZeroOnNull_Test;
这个作品因为每个测试是如在前面提到的回答它自己的类。
有一个更好的策略是不允许你的单元测试中的朋友的测试。
允许朋友测试中访问私有成员将导致代码库是很难维护。那个破每当组件的内部实现细节重构测试是不是你想要的。如果额外的努力,转而投入得到一个设计的组件能够通过他们的公共接口进行测试,你会得到测试,只需要更新每当组件的公共接口进行更新。
测试依靠gtest/gtest_prod.h
应该被视为不良设计的标志。
在您的测试类和测试类在不同的命名空间(例如,您的测试是在全局命名空间),你可能需要前瞻性声明你的测试类,并在FRIEND_TEST添加您的命名空间前缀:
// foo.h
#include <gtest/gtest_prod.h>
class FooTest_BarReturnsZeroOnNull_Test;
// Defines FRIEND_TEST.
class my_namespace::Foo {
...
private:
FRIEND_TEST(::FooTest, BarReturnsZeroOnNull);
int Bar(void* x);
};
// foo_test.cc
using namespace my_namespace;
...
TEST(FooTest, BarReturnsZeroOnNull) {
Foo foo;
EXPECT_EQ(0, foo.Bar(NULL));
// Uses Foo's private member Bar().
}
我知道朋友单元测试(或者在C ++中一般友善)和白盒测试是一个有争议的问题,但是当你上复杂的,科学的算法工作,每个步骤,该步骤的需要测试和验证,但你不希望在公众(甚至保护)接口暴露,朋友测试,在我看来是一个简单而实用的解决方案,尤其是在测试驱动的开发方法。它始终是可以稍后重构代码(或完全去除白盒测试),如果它是对一个人的宗教使用友好或白盒测试。
不隶属于 StackOverflow