1

我是 Google Mock 的新手,根据我对文档和在线资源的理解,我无法找到解决问题的方法:

我有以下课程:

class A
{
    public:
        A() { }
        int fun1()
        {
            //Some code
            B b;
            x = b.fun2();
            //Some other code
        }
};
class B
{
    public:
        B() { }
        int fun2()
        {
            //Some code
            y = C::fun3();
            //Some code
        }
};
class C
{
    public:
        static int fun3()
        {
            //Read a file and provide success if a certain pattern is found
        }
};

现在我正在尝试为 A::fun1() 编写 Google 测试。但是由于代码的结构(所有调用都是通过对象进行的,并且我没有可以使用它来初始化模拟等的基类,所以我无法成功模拟它。

有人可以帮助我了解这是否可以用当前形式的 Google Mock 进行模拟?请注意,我不允许更改原始源代码。

4

1 回答 1

2

只要可以使用静态接口(即模板参数)配置被测类,您就可以这样做。有关更多信息,请参见此处:模拟非虚拟方法

另一种选择可能是在您的测试类中引入包装器接口,可以像往常一样模拟:Alternative to Mocking Concrete Classes

如果您无法更改任何代码,恕我直言,这是不可能的。

更新:只要class B在里面实例化,无论如何A::fun1()都很难模拟。B它应该作为参数传递,因此您有机会控制测试方法中的实例化。

对您来说可能是一个可行的解决方案,可能是欺骗构建环境进行测试,并提供一个声明和定义来class B提供一个模拟。

于 2012-11-07T16:49:41.140 回答