在我们的项目中,我们使用的是Google Mock,但在多个地方我们正在制作生产代码中的结构,只是为了确保类“可模仿”。我们这样做是因为我们希望获得Google Mock的好处,但另一方面我们希望拥有更优化的生产代码。以下情况是我们经常做的事情,并希望摆脱它。
class A{
public:
void doSomething(); //Does something with _someB
void setSomeB(B* mockedB); //This is only here for GMock
private:
B* _someB; //This should not be a pointer, it is a pointer only for GMock
}
这只是一个简单的例子,你可以看到,我遗漏了细节。基本上我们想要摆脱B作为指针。我们将它作为指针的原因是我们可以在我们的测试代码中对B进行子类化(模拟它)并使用该setter进行设置。
有什么方法可以避免这种情况吗?难道我们不能让B成为班级的范围吗?
由于
答案 0 :(得分:1)
如果你真的不希望将_someB
作为指针,那么选项就是将它的声明包装在预处理器命令中:
#ifdef MOCK_TEST
B _someB;
#else
MockB _someB;
#endif
如果不这样做,就没有简单的方法可以在_someB
上放置gmock期望和/或断言,因为它不是模拟对象的实例。除了这种丑陋之外,它还有一个缺点,就是要求Class A
所居住的lib被编译两次,一次定义MOCK_TEST
而一次没有。但它确实消除了_someB
的设定者的需要。
即使您选择将_someB
作为指针,也许比创建公共setter更好的选择是将测试类声明为A
的友元类以允许直接测试设置并访问_someB
。
顺便说一下,通常使用前导下划线命名变量considered poor form。