【问题标题】:HippoMock : mocking just a part of classHippoMock : 模拟类的一部分
【发布时间】:2014-03-26 19:04:50
【问题描述】:

我想知道是否可以使用 HippoMock 模拟类的一部分。

例子

class aClass
{
public:
    virtual void method1() = 0;

    void method2(){ 
        do
            doSomething;      // not a functon 
            method1();
        while(condition);
    };
};

我想模拟方法 1 以测试方法 2

很明显,我使用 HippoMock 并且我在方法 2 中有一个错误,所以我进行了单元测试以纠正它并确保它不会再出现。但是我没有找到方法。

我试试这个

TEST(testMethod2)
{
    MockRepository mock;
    aClass *obj = mock.Mock<aClass>();
    mock.ExpectCall(obj , CPXDetector::method1);
    obj->method2();
}

本机 cpp 有一些解决方案吗?使用其他模拟框架?

非常感谢

Ambroise Petitgenêt

【问题讨论】:

  • 我不明白你的问题(如果我明白,答案是“是”)。可能您错误地使用了“模拟”一词。可以用mock写一个你想写的单元测试的例子吗?
  • 我想写的单元测试看起来像
     TEST(testMethod2) { MockRepository mocks; A *a = mocks.Mock(); mocks.ExpectCall(a, A::method1);一个->方法2(); }

标签: c++ unit-testing mocking hippomocks


【解决方案1】:

这个答案有两个部分。首先是,是的,这很容易做到。其次,如果您需要以这种方式构建测试,您通常会遇到不幸的类设计——这通常发生在您需要对遗留软件进行测试时,而类设计无法合理地修复。

如何测试这个?据我所知,您可以为此使用 Hippomocks,但由于我有一段时间没有使用它,所以我不记得该怎么做。因为您要求任何解决方案,即使是使用不同框架的解决方案,我建议使用直接方法而不是使用 hippomocks:

class bClass : public aClass
{
    int _counter;
public:
    bClass() : aClass(), _counter(0){}
    void method1() { _counter++; }
    int NumCallsToMethod1() const { return _counter; }
};

TEST(testMethod2)
{
    bClass testThis;
    testThis.method2();
    TEST_EQUALS(1,testThis.NumCallsToMethod1());
}

或者,如果method1const

class bClass : public aClass
{
    mutable int _counter;
public:
    bClass() : aClass(), _counter(0){}
    void method1() const { _counter++; }
    int NumCallsToMethod1() const { return _counter; }
};

【讨论】:

  • 首先是的,我正在使用遗留代码,我无法全部重构。其次,您的解决方案很好,我喜欢它
  • 我认为上面的模式,以及其他几个在本书中都有描述:amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/…
  • 我在看你寄给我的书。这很有趣。非常感谢
  • HippoMocks 可以在非虚拟成员函数调用虚拟成员函数的情况下执行此操作 - 您只能模拟虚拟成员函数。但是在这种情况下,由于您依赖于模拟的实现细节,我仍然会使用@Peter 的解决方案,如果只是为了使其明确。
猜你喜欢
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多