我是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中,它是值。我的问题是:
memcpy(&g->bar, b, sizeof(*b))
?谢谢你的时间!
答案 0 :(得分:0)
我在我的系统上测试了你的问题。在我看来有点相同。
我的猜测是,问题是你很难复制模拟。
您的期望实际上是"b"
将被调用,实际上g->bar
将被调用。
我真的不知道它是如何完成的,但我认为模拟器将调用信息存储在自己的某个地方。
但如果我尝试使用"&(g->bar)"
,我会收到完全不同的错误。
stacktrace指向
void _Adopt(const _Container_base12 *_Parent)