gpt4 book ai didi

c++ - 聚合对象使用 googlemock 调用的模拟函数

转载 作者:行者123 更新时间:2023-11-30 05:08:46 25 4
gpt4 key购买 nike

我有一个场景,其中实例化本地对象以调用该类的方法,即 setSessionId()。 setSessionId的定义如下:

int Cli::setSessionId()
{
SessionHandler oHandleSession;
return oHandleSession.getSessionId(sSessionId);
}

现在为了模拟 SessionHandler 的函数,我使用宏在我想要模拟的函数之前添加 virtual 关键字,在本例中为 getSessionId() 因为这个类不是抽象的,函数也不是纯虚拟的。(我知道 Hi-Perf Dependency Injection 但不想在这个阶段进入它)

如果是这样的话

int Cli::setSessionId(SessionHandler* oHandleSession)
{
...
return oHandleSession->getSessionId(sSessionId);
}

将模拟对象传递给函数 setSessionid() 会很简单,但是由于使用了聚合,我该如何模拟此函数 getSessionId()

最佳答案

您可以使用静态多态性,也可以使用链接时替换。

对于静态多态你做这样的事情:

class DefaultSessionHandler {
// methods implemented as you do now
};

template <typename T>
class SessionHandlerT {
// methods implemented in terms of delegation to methods on T
};

using SessionHandler = SessionHandlerT<DefaultSessionHandler>;

这可能有点麻烦并且会引入额外的编译时间,虽然它可以工作,但我不太喜欢这种方法,尽管我之前已经做过多次。

通过链接时替换,您可以提供 SessionHandler 的替代实现并在链接时解决问题。这意味着您有 SessionHandler 类的一些其他实现,即使它们具有相同的名称,它们也会做一些不同的事情。同样,这很麻烦,但可以解决。

这两种方法都有自己的一系列问题和痛苦。一种更好的单元测试方法是通过重构 SUT 来简单地使用依赖注入(inject)。

另一种方法是放弃单元测试,只执行集成测试。这也有它自己的一系列问题。

关于c++ - 聚合对象使用 googlemock 调用的模拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46582776/

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