我刚开始做单元测试(使用BOOST框架进行测试,但对于Mock我必须使用Google Mock),我有这样的情况:
class A
{
static int Method1(int a, int b){return a+b;}
};
class B
{
static int Method2(int a, int b){ return A::Method1(a,b);}
};
因此,我需要创建模拟类A,并使我的类B不使用来自A类的真实Method1,而是使用模拟类。
我不确定如何做到这一点,我也找不到类似的例子。
发布于 2012-01-21 00:15:53
您可以将类B更改为模板:
template< typename T >
class B
{
public:
static int Method2(int a, int b){ return T::Method1(a,b);}
};
然后创建一个mock:
struct MockA
{
static MockCalc *mock;
static int Method2(int a, int b){ return mock->Method1(a,b);}
};
class MockCalc {
public:
MOCK_METHOD2(Method1, int(int,int));
};
在每次测试之前,初始化静态模拟对象MockA::mock
。
另一种选择是直接调用A::Method1
,在类B中创建一个函数器对象(可能是std::function类型),然后在Method2中调用它。然后,它就更简单了,因为您不需要MockA,因为您将为这个对象创建一个到MockCalc::Method1的回调。如下所示:
class B
{
public:
static std::function< int(int,int) > f;
static int Method2(int a, int b){ return f(a,b);}
};
class MockCalc {
public:
MOCK_METHOD2(Method1, int(int,int));
};
并初始化它:
MockCalc mock;
B::f = [&mock](int a,int b){return mock.Method1(a,b);};
发布于 2022-01-06 03:57:10
jomock是Windows应用的可行解决方案之一
class A
{
public:
static int Method1(int a, int b) { return a + b; }
};
class B : public A
{
public:
static int Method2(int a, int b){
return A::Method1(a, b);
}
};
TEST(JoMock, Method1Test)
{
EXPECT_CALL(JOMOCK(A::Method1), JOMOCK_FUNC(_, _))
.WillRepeatedly(Return(3));
EXPECT_EQ(B::Method2(1, 3), 3);
}
B::Method2(1,3)在这种情况下返回3。
发布于 2022-01-20 21:58:46
基于BЈовић的答案的一个变体版本,允许不使用模板(如果您的实现不在头文件中,则还允许使用容易出错的显式模板专门化)。但是,这将需要使类A不再是静态的。
首先,创建一个接口类
class AIf
{
int Method1(int a, int b) = 0;
};
让你的A类实现AIf
class A : AIf
{
int Method1(int a, int b){return a+b;}
};
然后在B类中,添加一个指向AIf的静态指针
class B
{
static AIf* impl = nullptr;
static int Method2(int a, int b) {return impl->Method1(a, b)}
};
当为GMock时,只需执行
class MockA : AIf {
MOCK_METHOD2(Method1, int(int a, int b));
};
然后在您的测试中,在调用任何函数之前设置impl
MockA mockA;
EXPECT_CALL(...);
B::impl = &mockA;
B::Method2(a, b);
https://stackoverflow.com/questions/8942330
复制相似问题