23

我刚开始进行单元测试(使用 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,而是使用模拟。

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

4

3 回答 3

31

您可以将 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);};
于 2012-01-20T16:15:53.373 回答
0

jomock是Windows应用案例可行的解决方案之一

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

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


TEST(JoMock, Method1Test)
{
    EXPECT_CALL(JOMOCK(A::Method1), JOMOCK_FUNC(_, _))
        .WillRepeatedly(Return(3));

    EXPECT_EQ(B::Method2(1, 3), 3);
}

B::Method2(1, 3) 在这种情况下返回 3。

于 2022-01-06T03:57:09.870 回答
0

基于 BЈовић 的答案的变体版本,允许不使用模板(如果您的实现不在头文件中,则容易出错的显式模板专业化)。但是,这将需要使 A 类不再是静态的。

一、创建接口类

class AIf
{
int Method1(int a, int b) = 0;
};

让你的 A 类实现 AIf

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

然后在你的 B 类中,添加一个指向 AIf 的静态指针

class B
{
static AIf* impl = nullptr;
static int Method2(int a, int b) {return impl->Method1(a, b)}
};

当 GMock 时,就做

class MockA : AIf {
MOCK_METHOD2(Method1, int(int a, int b));
};

然后在您的测试中,在调用任何函数之前设置 impl

MockA mockA;
EXPECT_CALL(...);

B::impl = &mockA;
B::Method2(a, b);
于 2022-01-20T21:58:46.020 回答