Hippomocks:属性是值而不是指针

时间:2018-01-15 12:56:56

标签: c++ pointers mocking hippomocks

我是Hippomocks和C ++的新手。我尝试编写一个可以捕获异常的Unittest。为此我写了以下测试:

#include <ostream>
#include "../Mocks/hippomocks.h"

///////  Mocking Test Classes /////////////////////

class IBar {                         // class used inside test class
public:
    virtual ~IBar() {}
    virtual int c(std::string s, int i)      // function to be mocked
        {
            if ( s == std::string("Hallole" ))
        {
            return 5;
        }
        else
        {
            return 7;
        }
    };
};

class Foo1 {

    public:
    Foo1(){ std::cout << "hier1" << std::endl;};
    IBar *bar;
    int a()                                  // function to under (unit-)test
    {
        return this->bar->c("Hallole", 3);
    };
};

class Foo2 {

public:
    Foo2(){ std::cout << "hier2" << std::endl;};
    IBar bar;
    int a()                                  // function to under (unit-)test
    {
        return this->bar.c("Hallole", 3);
    };
};


///////  Mocking Test Classes End /////////////////////


void test(){


    ///////  Test hippomock /////////////////////

    MockRepository mocks;

    IBar *b = mocks.Mock<IBar>();
    Foo1 *g = new Foo1();

    g->bar = b;

    mocks.ExpectCall(g->bar, IBar::c).Throw(std::exception());
    CPPUNIT_ASSERT_THROW (g->a(), std::exception);

    ///////  Test hippomock end /////////////////////


}

void TestTest::test_a(){

    ///////  Test hippomock /////////////////////

    MockRepository mocks;

    IBar *b = mocks.Mock<IBar>();


    Foo2 *g = new Foo2();

    // g->bar = *b;
    memcpy(&g->bar, b, sizeof(*b));
    mocks.ExpectCall(b, IBar::c).Throw(std::exception()); 
    CPPUNIT_ASSERT_THROW (g->a(), std::exception);

    ///////  Test hippomock end /////////////////////

}

test()正常工作,这是我在https://app.assembla.com/wiki/show/hippomocks/Tutorial_3_0上找到的一个例子。

但如果我运行test_a(),则不会抛出任何异常,我会得到以下内容:

uncaught exception of type HippoMocks::CallMissingException
- Function with expectation not called!
Expections set:
TestTest.cpp(97) Expectation for IBar::c(...) on the mock at 0x0x7f14dc006d50 was not satisfied.

我看到Foo1和Foo2之间的区别在于,在Foo1中,属性栏是指针,而在Foo2中,它是值。我的问题是:

  1. 为什么会有不同的行为?或者更确切地说,为什么不抛出异常,因为我为模拟对象b设置了memcpy(&g->bar, b, sizeof(*b))
  2. 如何在不更改类的情况下修复它?
  3. 谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

我在我的系统上测试了你的问题。在我看来有点相同。

我的猜测是,问题是你很难复制模拟。

您的期望实际上是"b"将被调用,实际上g->bar将被调用。

我真的不知道它是如何完成的,但我认为模拟器将调用信息存储在自己的某个地方。

但如果我尝试使用"&(g->bar)",我会收到完全不同的错误。

stacktrace指向

void _Adopt(const _Container_base12 *_Parent)