如何在gtest中使用带有命名空间的友元类

时间:2015-11-28 20:23:04

标签: c++ namespaces friend googletest

假设我的Add.h在命名空间内,并且我使它成为AddTest的朋友,因此它可以访问AddTwoNumber。

namespace mynamespace
{

class Add
{
 friend class AddTest;

 public:
  Add(){};
  ~Add(){};

 private:
  int AddTwoNumber(const int a, const int b){return a+b};
};

}

我的AddTest.h是

#include "Add.h"
#include "gtest/gtest.h"

class AddTest : public ::testing::Test
{
 protected:
  AddTest(){};
  virtual ~AddTest(){};

  virtual void SetUp()
  {
    mynamespace::Add addobj;
    result = addobj.AddTwoNumber(2, 3);
  };

  virtual void TearDown(){};

  int result;
};

但是,AddTwoNumber是私有的返回错误。如果我拿出" mynamespace"在Add.h中。有没有办法保持命名空间仍然允许AddTest访问Add.h中的私有方法?

2 个答案:

答案 0 :(得分:3)

使用

将AddTest限定在全局命名空间中
friend class ::AddTest;

如果没有::,则会将nynamespace::AddTest声明为朋友。

答案 1 :(得分:0)

测试代码不应出现在生产代码的声明中。换句话说,如果需要测试AddTwoNumber,那么它的行为应该是可测试的,并且可以通过类Add的公共成员观察到。如果没有人能够从AddTwoNumber类的可调用接口中观察到Add的后果,那么它怎么能做任何有用的事情呢?

当您首先编写代码测试时,您最终会得到自然遵循此组织的生产代码。当你在之后编写测试时,你最终会遇到你想要测试的东西被埋在里面的情况。这是Legacy Code(没有测试的代码)的情况。在编写测试之前编写实现时,您将创建遗留代码。

有关使用旧代码的更多详细信息,请参阅Michael Feathers一书"Working Effectively with Legacy Code"。他描述了许多解耦代码的技术,以便您可以在不必要地污染公共声明的情况下对其进行测试。

立即查看我的C ++! 2014年关于Test-Driven Development in C++的研讨会,使用Boost.Test对C ++中的测试驱动开发进行了温和的介绍。研讨会包括演示文稿中每个步骤的代码,以便您可以直接在计算机上进行演示。

Jeff Langr的书"Modern C++ Programming with Test-Driven Development"是使用现代C ++进行测试驱动开发的绝佳方法。杰夫的书中有一个参考书目,其中引用了对实验研究的研究,显示了测试驱动开发的好处。