问题 Google Mock单元测试静态方法c ++


我刚刚开始进行单元测试(使用BOOST框架进行测试,但对于模拟我必须使用Google Mock)我有这样的情况:

class A
{
static int Method1(int a, int b){return a+b;}
};

class B
{
static int Method2(int a, int b){ return A::Method1(a,b);}
};

所以,我需要创建模拟类A,并使我的类B不使用来自A类的真正的Method1,而是使用mock。

我不知道该怎么做,我找不到类似的例子。


6263
2018-01-20 13:44


起源

我不熟悉gmock,但你不能直接链接 B.o 和 mockA.o? - Beta
据我所知,处理静态方法有一些不同的方法。我可以通过使Method1成为虚拟来解决这个问题,并在B类中添加构造函数,所以它看起来像B(A&a):a_in_class_b(a){},然后调用Method1看起来像这样:a_in_class_b- >方法1();但我想知道是否还有其他方法。 - Jonhtra


答案:


您可以将B类更改为模板:

template< typename T >
class B
{
public:
static int Method2(int a, int b){ return T::Method1(a,b);}
};

然后创建一个模拟:

struct MockA
{
  static MockCalc *mock;
  static int Method2(int a, int b){ return mock->Method1(a,b);}
};
class MockCalc {
 public:
  MOCK_METHOD2(Method1, int(int,int));
};

在每次测试之前,初始化静态模拟对象 MockA::mock

另一个选择是直接打电话 A::Method1,在类B中创建一个仿函数对象(可能是std :: function类型),并在Method2中调用它。然后,它更简单,因为你不需要MockA,因为你会为这个对象创建一个MockCalc :: Method1的回调。像这样的东西:

class B
{
public:
static std::function< int(int,int) > f;
static int Method2(int a, int b){ return f(a,b);}
};

class MockCalc {
 public:
  MOCK_METHOD2(Method1, int(int,int));
};

并初始化它:

MockCalc mock;
B::f = [&mock](int a,int b){return mock.Method1(a,b);};

16
2018-01-20 16:15



谢谢,这是我正在寻找的答案:) - Jonhtra
@ user1160721左边应该有“接受答案”按钮,如果这个答案是你要找的答案;) - BЈовић
是的,我现在可以看到它,我会点击它,我是新来的。我可以看到每个用户都有一些评级,这个“接受答案”会增加这个评级:)我还有一个与此相关的类似问题。发布新的,或在评论中提问? :) - Jonhtra
我发布了一个新的qustion所以当你赶时间看看:) - Jonhtra