我需要在海龟模拟中模拟数组的元素。不幸的是,因为turtle mock 宏MOCK_BASE_CLASS
添加了额外的“gunk”,例如mock::object
,mock::detail::base<>
等等,基本类型和mock 类型的大小不再相同。因此,当指向基类的指针指向模拟类型的数组时,指针索引会失败,如下所示。
#define BOOST_TEST_MODULE First_TestSuite
#include <boost/test/included/unit_test.hpp>
#include <turtle/mock.hpp>
#include <iostream>
struct Foo
{
int data = 42;
};
MOCK_BASE_CLASS(mockFoo , Foo)
{
};
BOOST_AUTO_TEST_CASE( Demo )
{
mockFoo mf[10];
Foo* b = mf;
std::cout << "b[1].data = " << b[1].data << std::endl;
BOOST_CHECK(b[1].data == 42);
//BOOST_CHECK(sizeof(mockFoo) == sizeof(Foo)); // Also fails. This is the culprit
}
执行输出
Running 1 test case...
b[1].data = 32764
Test047b.cpp(23): error: in "Demo": check b[1].data == 42 has failed
*** 1 failure is detected in the test module "First_TestSuite"
我很感激有关如何解决此问题的建议。请注意,我无法更改模拟框架,并且基本类型必须是指针,以便它将指向数组的指针存储到基本类型或模拟类型。
更新
下面的例子更接近我遇到的问题。MOCK_BASE_CLASS
为了模拟虚拟功能,使用实际上是不可避免的。我知道问题在于存储as的数组。我现在找到了一个解决方案,我将根据反馈发布。mockFoo
Foo
struct Foo
{
int value = 42;
int func(){ return value;}
virtual void unused(){}
};
MOCK_BASE_CLASS(mockFoo , Foo)
{
MOCK_METHOD(unused , 0 , void());
};
struct Bar
{
Bar(Foo* f) : foo(f)
{
}
Foo* foo;
};
BOOST_AUTO_TEST_CASE( Demo )
{
mockFoo mf[10];
Bar bar(mf); // uh-oh!
int value = bar.foo[1].func();
std::cout << "bar.foo[1].func() = " << value << std::endl;
BOOST_CHECK(42 == value);
}
结果
Running 1 test case...
bar.foo[1].func() = -960497840
Test047d.cpp(35): error: in "Demo": check 42 == value has failed
*** 1 failure is detected in the test module "First_TestSuite"