【问题标题】:Mock object c++模拟对象 C++
【发布时间】:2014-02-14 18:06:28
【问题描述】:

我正在阅读有关 TDD 的内容,想知道是否可以在不使用 easyMock 之类的额外测试库或类似的东西的情况下编写任何模拟对象。

例如我有代码:

class Person
{
  int age;
  int add ( int x) { return this.age + x }
}

如何编写模拟对象来测试上面的代码?

【问题讨论】:

  • 你想在这里模拟什么?我认为在这种情况下测试是直截了当的,根本不需要嘲笑

标签: c++ testing mocking tdd


【解决方案1】:

您不会使用该类的模拟来测试这样的类。你测试接口。事实上,您的代码看起来可能是一个模拟对象来测试其他代码。

// defined in code that is being tested
class Person {
    virtual int add(int) = 0;
}
void foo(const Person& bar) {
    // use person somehow
}

要测试上述接口,您可以创建一个模拟对象。该对象没有实际实现可能具有的要求。例如,虽然实际实现可能需要数据库连接,但模拟对象不需要。

class Mock: public Person {
    int add(int x) {
        // do something less complex than real implementation would
        return x;
    }
}

Mock test;
foo(test);

如果您想测试模板函数,则无需使用继承。

template<class T>
void foo(T bar) {
    // Code that uses T.add()
}

要像这样测试接口,你可以像这样定义模拟对象

class Mock {
    int add(int x) {
        // do something less complex than real implementation would
        return x;
    }
}

【讨论】:

  • 这就是我需要了解的。谢谢。
【解决方案2】:

当您在代码中使用外部资源(例如数据库、文件等)时,模拟很有用。为此,您将实现这些接口,使其“伪造”所需的步骤,以便可以测试您实际测试的代码(您的业务逻辑),而不必担心由于以下原因而导致的假阴性测试外部资源的情况。

您发布的代码不需要模拟来测试它。

【讨论】:

  • 谢谢。你知道 c++ 中模拟对象的任何简单示例吗?
  • 我的意思是看看它是如何使用简单的模拟类工作的
  • 例如,如果您有一个需要数据库连接的类,您将模拟该数据库连接以返回测试中使用的受控数据。模拟将是您的硬编码实现。与脚本或托管语言不同,C++ 无法进行部分模拟(即只是模拟您在给定测试中使用的功能);您必须为类/接口中的每个函数提供基本实现。
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 2012-02-29
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多