1

在我们的项目中,我们使用 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 在班级范围内吗?

谢谢

4

1 回答 1

1

如果您真的不想_someB将其保留为指针,则可以选择将其声明包装在预处理器命令中:

#ifdef MOCK_TEST
    B _someB;
#else
    MockB _someB;
#endif

如果您不这样做,则没有简单的方法可以将 gmock 期望和/或断言放在 上_someB,因为它不会是模拟对象的实例。除了丑陋之外,它还有一个缺点,就是需要Class A编译两次所在的库,一次有MOCK_TEST定义,一次没有。然而,它确实消除了对 setter 的需要_someB

即使您选择保留_someB为指针,也许比创建公共设置器更好的选择是将测试类声明为的朋友类,A以允许测试直接设置和访问_someB


顺便说一句,使用前导下划线命名变量 通常被认为是一种糟糕的形式。

于 2012-04-06T19:37:25.933 回答