gpt4 book ai didi

c++ - googlemock 如何在测试中使用模拟

转载 作者:行者123 更新时间:2023-11-28 04:07:17 25 4
gpt4 key购买 nike

我是 google mock 的初学者,我不确定如何使用它和概念。

如果我试图测试一个类中的方法,而这个类正在调用不同类中的一些其他方法。我是否需要从我的测试方法调用的不同类中模拟所有这些方法。这是一个例子:


class A {
public:
A () {}
int setnum(int num) {//do some stuff return 1 or 0//
}


private:
int _num;
};


class B {

public:
B (){}
int init(A *a, int number){
if(a->setnum(number))
return 1;
return 0;
}
void setNum(int num){_num=num;}

private:
A *_a;
int _num;
};



class C {
public:
int doSoemthing(A *a, int number){

if (domore(a,number))
return 1;
return 0;
}

int domore(A *a, int number){
if(_b.init(a,number))
return 1;
return 0;

;}

private:
B _b;
};

我是否需要模拟 A 类和 B 类中测试我的测试方法所需的所有方法?或者我可以只模拟一个 Class ,然后测试这个类是否正常工作。

最佳答案

为了使用模拟测试 C 类,您需要为依赖项引入一个接口(interface),而不是在 C 类中使用(这里,添加了 BIface)。然后你需要使用 BIface 的依赖注入(inject)到 C 类(通过添加的构造函数)。有了它,您将能够测试 B 类和 C 类的交互。 IMO A 类不需要在 CTest 中模拟(但很可能需要在 BTest 中进行测试)

class A {
public:
A() {} // not needed
int setnum(int num) { // do some stuff return 1 or 0//
}

private:
int _num;
};

class BIface {
public:
virtual ~BIface() = default;

virtual int init(A *a, int number) = 0;

virtual void setNum(int num) = 0;
};

class B : public BIface {

public:
B() {} // not needed
int init(A *a, int number) override {
if (a->setnum(number))
return 1;
return 0;
}
void setNum(int num) override {
_num = num;
}

private:
A *_a;
int _num;
};

class C {
public:
C(BIface &b) : _b{b} {}
int doSoemthing(A *a, int number) {

if (domore(a, number))
return 1;
return 0;
}

int domore(A *a, int number) {
if (_b.init(a, number))
return 1;
return 0;

;
}

private:
BIface &_b;
};

class BIfaceMock : public BIface {
public:
MOCK_METHOD2(init, int(A *, int));
MOCK_METHOD1(setNum, void(int));
};

TEST(CTest, givenDoingMoreWhenInitOfBReturnOneThenReturnOne) {
// can be done in CTest ctor if more tests are needed to avoid code duplciation
BIfaceMock bMock{};
A a{}; // `a` doesn't need to be mocked in CTest. It shall be mocked in BTest as it is dependency of B class, not C class
C testedObject{bMock}; // dependency injection of BFace to C

const auto SOME_INT_PARAM = 42;

// Eq mather is used to match both &a and SOME_INT_PARAM. This confirms proper parameters were passed to init
EXPECT_CALL(bMock, init(&a, SOME_INT_PARAM)).WillOnce(Return(1));

ASSERT_EQ(1, testedObject.domore(&a, SOME_INT_PARAM));
}

关于c++ - googlemock 如何在测试中使用模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58501850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com