【发布时间】:2016-02-26 08:18:33
【问题描述】:
我想为我们的项目创建一个单元测试环境。但是我对如何为班级成员创建模拟感到迷茫。我想用一个例子来解释我的问题。
在我以前的项目中,我们使用了一种模拟选择机制,在我看来这很丑陋。这是老方法:
class member {
};
class member_mock_1 {
};
class member_mock_2 {
};
class parent {
#if defined UNIT_TEST_1
typedef member_t member_mock_1;
#elif defined UNIT_TEST_2
typedef member_t member_mock_2;
#else
typedef member_t member;
#endif
private:
member_t mem;
};
第一个问题是在父类中使用类型定义来模拟成员对象的类是否正确?最佳做法是什么?如果我想使用单元测试框架,比如 gtest,我应该使用这种方式还是有其他方式来模拟成员?
注意1:如果激活了virtual机制,可以创建基类方便mock,如果类是pod什么的,我不想用这个机制。
注 2:我还发现将成员类型作为模板参数传递很丑陋,项目中的一切都变成了模板。我不想那样做。这是一个例子:
template <typename M>
class parent {
private:
M mem;
};
#if defined UNIT_TEST_1
typedef parent_t parent<member_mock_1>;
#elif defined UNIT_TEST_2
typedef parent_t parent<member_mock_2>;
#else
typedef parent_t parent<member>;
#endif
这是我在这里建议的方法:
member_mock_1.hpp
class member_mock_1 {
};
member_mock_2.hpp
class member_mock_2 {
};
模拟.hpp
template <typename TYPE>
struct mock { using type = TYPE; };
#define ENABLE_MOCKING(NamE) \
using NamE ## _t = mock<NamE>::type
member_mock.hpp
#if define UNIT_TEST_1
template<>
struct mock<member> { using type = member_mock_1 };
#endif
#if define UNIT_TEST_2
template<>
struct mock<member> { using type = member_mock_2 };
#endif
member.hpp
class member {
};
ENABLE_MOCKING(member);
父级.hpp
class parent {
private:
member_t mem;
};
我上面提到的方法适用于普通课程。对于模板类,我认为应该做一些额外的工作。
因此,作为结论,我建议采用上述的单元测试结构。可能没有必要,还有一些其他机制或方法可以满足该要求。也许我还在重新发明轮子:(
请提出一种你知道的嘲弄班级成员的方法。
谢谢。
【问题讨论】:
标签: c++ unit-testing mocking