我听说有可能使谷歌测试的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 ++中一般友善)和白盒测试是一个有争议的问题,但是当你上复杂的,科学的算法工作,每个步骤,该步骤的需要测试和验证,但你不希望在公众(甚至保护)接口暴露,朋友测试,在我看来是一个简单而实用的解决方案,尤其是在测试驱动的开发方法。它始终是可以稍后重构代码(或完全去除白盒测试),如果它是对一个人的宗教使用友好或白盒测试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top