假设我的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中的私有方法?
答案 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 ++进行测试驱动开发的绝佳方法。杰夫的书中有一个参考书目,其中引用了对实验研究的研究,显示了测试驱动开发的好处。