在大型代码库中,我们遇到了以下问题:
A类包含method1(a,b,c)
B类继承自A,并包含method1(a,b,c)(A中的一个重载)
当将新的默认参数添加到A类的method1时出现问题,但是:
修复很简单,因为新参数被添加到B的方法中。
我想编写一个单元测试来检查B的方法和A的方法是否具有完全相同的参数数量(即,B的方法应该总是更新)。
您对我如何做到这一点有什么想法吗?
注意:没有c ++ 11。
以下是我的案例的类似代码:
部首:
class Parent:
{
public:
virtual bool method(int a, int b, int c=1);
};
class Child: public Parent
{
public:
virtual bool method(int a, int b);
};
CPP:
class Parent:
{
boot method(int a, int b, int c)
{
...
}
}
class Child:
{
boot method(int a, int b)
{
...
}
}
由于代码在第一次使用3个参数时尚未更新,我们仍然调用Child.method(a,b),没有第三个参数。
稍后,它将破坏代码,但我的目的只是确保两个方法始终具有相同数量/类型的参数。
答案 0 :(得分:1)
assert(&method != &Parent::method);
那样的东西?我没试过。
答案 1 :(得分:1)
以下无法编译为
bool method(int a, int b)
隐藏bool method(int a, int b, int c)
:https://ideone.com/rf4TU5
Child child;
child.method(1, 2, 3);
检查类验证某个接口的可能性:
#define DEFINE_HAS_SIGNATURE(traitsName, funcName, signature) \
template <typename U> \
class traitsName \
{ \
private: \
template<typename T, T> struct helper; \
template<typename T> \
static char check(helper<signature, &funcName>*); \
template<typename T> static char (&check(...))[2]; \
public: \
static \
const bool value = sizeof(check<U>(0)) == sizeof(char); \
}
DEFINE_HAS_SIGNATURE(has_method_2, T::method, bool (T::*)(int, int));
DEFINE_HAS_SIGNATURE(has_method_3, T::method, bool (T::*)(int, int, int));
// Aggregate all requirements for Interface
template <typename T>
struct check_Parent_Interface
{
static const bool value = !has_method_2<T>::value && has_method_3<T>::value;
};
在测试中,请检查:https://ideone.com/pPitVq
EXPECTED(true, check_Parent_Interface<Parent>::value);
EXPECTED(true, check_Parent_Interface<Child>::value);
答案 2 :(得分:0)
您的测试听起来更像是烟雾测试,然后是实际的单元测试imo。
如果您已经对代码进行了烟雾测试,则可以在A和B的头文件中添加一个对method1的函数定义执行diff的测试,并查看它们是否足够相似(完全匹配,完全匹配)剥离空格/制表符,相同数量的逗号......)。