C++ - 在单元测试中创建间谍

C++ - Creating a Spy in unit tests

我有一些C++代码如下:

class MyClass
{
public:
    MyClass(OtherClass *obj)
    {
        obj_ = obj;
    }
    void myMethod()
    {
        // Do something
        int value = obj_->otherMethod();
        // Do something else
    }
private:
    OtherClass *obj_;
}

我想创建一个单元测试来测试 myMethod() 的功能。不幸的是,OtherClass 是一个外部库,它的方法没有声明为虚拟的(所以我不能继承这些方法并在模拟中将它们存根)。我有一些使用 Mockito 的经验,我可能会为此目的使用间谍。但我似乎找不到 C++ 中的等效项。

我现在使用的是 googletest 框架,这个问题的上下文(如果有帮助的话)在 ROS 中,我实际上是在其中尝试剔除 tf::TransformListener

问题 1: 是否有我可能不知道并且可以在这种情况下利用的间谍替代品?

问题 2:如果没有,有没有一种快速简便的方法来重组我的代码我可以利用模拟吗?

通过执行以下操作解决:

class IOtherMethodAdapter
{
public:
    virtual int otherMethod() = 0;
}

class OtherClassOtherMethodAdapter : public IOtherMethodAdapter
{
public:
    int otherMethod() { return obj_->otherMethod(); }
private:
    OtherClass *obj_;
}

现在我在 MyClass 中使用指向 IOtherMethodAdapter 的指针而不是 OtherClass 并且为了测试我只是将接口的实现初始化为 stubbed/mock 对象。如果还有其他方法,请随时 post 该解决方案。