gpt4 book ai didi

inheritance - 如何使用 gmock 模拟调用基类

转载 作者:行者123 更新时间:2023-12-05 03:12:59 41 4
gpt4 key购买 nike

给定如下 2 个类:

class Base
{
public:
virtual void doSmt(void);
}

class Derived : public Base
{
void doSmt(void) { Base::doSmt(); }
}

我需要测试的类是Derived。但我不想深入 Base,我只想检查是否在 doSmt()

内部调用了对 Base 的调用

像这样:

TEST_F(Derived, DoSmt)
{
EXPECT_CALL(Base, doSmt()).Times(1);
testedInstance.doSmt();
}

因为我已经对Base进行了测试,并且Base被2个类继承。

有什么办法吗?

最佳答案

我被指派与 gmock 一起为“邪恶”设计编写单元测试。从一开始就比我更难,但我也有自己的解决方案。

虽然比我简单(再次:D)

1.将任何需要的模拟插入到基类头中。或者您可以创建一个新的并指定其路径包含。

class Base
{
public:
MOCK_METHOD0(mock_doSmt, void());
void doSmt(void);
}

2.为了调用Base模拟方法,只需创建BaseStub.cpp

此源仅用于模拟。因此,您必须使用 BaseStub.cpp 进行编译和链接而不是 Base.cpp

void Base::doSmt(void) { mock_doSmt(); }

3.测试时

EXPECT_CALL(*reinterpret_cast<Base*>(&derivedInstance), mock_doSmt()).Times(1);

mock_doSmt 而不是 doSmt

这种方式也可以解决Singleton。像上面一样创建 SingletonStub,在 SetUp() 中只是 singletonInstance = Singleton::getInstance();

记住:这样,您有 2 个源代码和 2 个标题。

面对这个笨蛋的时候,我认识到应该使用#include <...>而不是 #include "..."

导致当您指定包含目录时,#include <...>会让你有更多的控制权。

我想分享的另一个重要的是

不要抽象太多您的 OOP。原因 之后这会让你(或你的同事)陷入非常大的麻烦。不要继承超过 2 级,只需 1 个接口(interface)和 1 个继承。

关于inheritance - 如何使用 gmock 模拟调用基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31619362/

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