【问题标题】:Mocking internal calls of a function being tested using googlemock使用 googlemock 模拟正在测试的函数的内部调用
【发布时间】:2012-11-07 16:26:47
【问题描述】:

我是 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 进行模拟?请注意,我不允许更改原始源代码。

【问题讨论】:

  • 我只是假设你想模拟class B,你能确认一下并准确回答你的问题吗?
  • 实际上,我想模拟 B 类或 C 类。在这种情况下,我遇到的最大问题是 C::fun3() 正在访问外部文件。

标签: c++ unit-testing googlemock


【解决方案1】:

只有当被测类可以使用静态接口(即模板参数)进行配置时,您才能这样做。请参阅此处了解更多信息:Mocking Nonvirtual Methods

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

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

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

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

【讨论】:

  • 嗨 g-makulik,我如何“通过为提供模拟的 B 类提供声明和定义来欺骗构建环境”?抱歉,我无法理解如何执行此操作。
  • 这个想法是设置不同的包含/库路径,当在测试环境中编译所有东西时,您的B.h 变体在“真实”之前可见。但是,这是否可能完全取决于您的构建系统的结构。如果您只能针对包含ABC 的预编译库编写测试,这根本不可能。
猜你喜欢
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
相关资源
最近更新 更多