首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google Mock单元测试静态方法c++

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

Stack Overflow用户
提问于 2012-01-20 21:44:38
回答 3查看 30.3K关注 0票数 22

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

代码语言:javascript
运行
复制
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,而是使用模拟类。

我不确定如何做到这一点,我也找不到类似的例子。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-21 00:15:53

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

代码语言:javascript
运行
复制
template< typename T >
class B
{
public:
static int Method2(int a, int b){ return T::Method1(a,b);}
};

然后创建一个mock:

代码语言:javascript
运行
复制
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的回调。如下所示:

代码语言:javascript
运行
复制
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));
};

并初始化它:

代码语言:javascript
运行
复制
MockCalc mock;
B::f = [&mock](int a,int b){return mock.Method1(a,b);};
票数 30
EN

Stack Overflow用户

发布于 2022-01-06 03:57:10

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

代码语言:javascript
运行
复制
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。

票数 0
EN

Stack Overflow用户

发布于 2022-01-20 21:58:46

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

首先,创建一个接口类

代码语言:javascript
运行
复制
class AIf
{
int Method1(int a, int b) = 0;
};

让你的A类实现AIf

代码语言:javascript
运行
复制
class A : AIf
{
int Method1(int a, int b){return a+b;}
};

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

代码语言:javascript
运行
复制
class B
{
static AIf* impl = nullptr;
static int Method2(int a, int b) {return impl->Method1(a, b)}
};

当为GMock时,只需执行

代码语言:javascript
运行
复制
class MockA : AIf {
MOCK_METHOD2(Method1, int(int a, int b));
};

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

代码语言:javascript
运行
复制
MockA mockA;
EXPECT_CALL(...);

B::impl = &mockA;
B::Method2(a, b);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8942330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档