如何替换命名空间中的函数

How to replace a function in a namespace?

本文关键字:命名空间 函数 替换 何替换      更新时间:2023-10-16

我正在为一个使用调度器的模块编写一些单元测试。我正在写一个假的调度器,这样我就可以检查哪些事件已经被安排、取消等。

我正在测试的代码在using namespace X调用的帮助下直接调用schedule函数,最后的调用是scheduler::schedule()。所以,我需要让我的fake的函数成为那个函数调用时调用的函数。

我不能更改库,我想我需要做的是覆盖命名空间中的函数,但我不确定应该如何做到这一点。最重要的是,调度器在其他地方实现,并通过using namespace调用导入到该代码项目中,库实现在每个命名空间嵌套级别都有几个不同的using namespace X调用,"以实现向后兼容性">

我该怎么做?

基本上,我们有这个:

namespace ndn {
namespace util {
namespace scheduler {
class Scheduler
{
EventId
schedule();
}
} // scheduler
} // util
} // ndn

然后在我的本地代码库中:

namespace nfd {
namespace scheduler {
using ndn::Scheduler;
EventId
schedule();
} // scheduler
} // nfd

现在,我正在写的代码看起来像:

namespace nfd {
namespace rib {
scheduler::schedule(...);
} // rib
} // nfd

所以,我需要的是给scheduler::schedule()打电话,以换取我的假货。在我的测试用例中,我有:

namespace nfd {
namespace rib {
namespace tests {
//test code
} // tests
} // rib
// Can I do this?
namespace scheduler {
EventId
fakeSchedule();
} // scheduler
} // nfd

我可以直接内联另一个命名空间调用并覆盖那里的调用吗?如果没有,我应该如何伪造调度程序才能完成这项工作?

它不是那样工作的。您不能"覆盖命名空间中的函数"。

您可以使用相同的函数编写一个假调度器,并在构建单元测试时将被测模块与假调度器而不是实际调度器链接。

否则,如果不更改测试中的代码,就无法在C++中做到这一点。