如何模拟调用其基本 class 方法的派生 class?
How to mock a derived class that calls its base class methods?
我正在对派生的 class 进行单元测试,并希望 EXPECT_CALL
调用属于其基础 class 的某个方法。
例如:
class Base {
public:
void move(int x, int y);
};
class Derived: public Base{
public:
RESULT update();
private:
int age;
};
HRESULT Derived::update(void) {
int param1 = 5, param2 = 10;
move(param1, param2);
age++;
return SUCCESS;
}
我不能只为 Derived 创建模拟并期望 move
因为没有依赖关系并且将调用实际的 move()。
我怎样才能模拟 move()
?我的最终目标是我需要期望使用正确的参数值调用 move()(在本例中为 param1 and param2
)。
当然这不是实际的代码,只是一个表示
我知道就 UT 而言,这不是一个好的设计,但这是为了测试一些遗留代码,我不允许重新格式化(但需要制作 UT)。所以能够模拟和测试 move() 是我真正拥有的最佳选择。
我们将不胜感激。谢谢!
在此代码中,请注意 mock。你在这里没有任何外部依赖。
此代码的测试如下所示:
TEST(DerivedTest, WhenUpdateIsCalledPossitionIsChangedAndItGetsOlder)
{
Derived foo;
foo.age = 1;
foo.update();
EXPECT_EQ(10, foo.x);
EXPECT_EQ(12, foo.y);
EXPECT_EQ(2, foo.age);
}
告诉我在这里嘲笑什么有意义的原因?
我认为不使用一些预处理技巧是不可能的。在测试时使方法虚拟化的那些技巧应该是最不痛苦的。
做这样的事情就足够了:
#if UNDER_TEST
#define TEST_VIRTUAL virtual
#else
#define TEST_VIRTUAL
#endif
class Base {
public:
TEST_VIRTUAL void move(int x, int y);
};
然后你可以像这样模拟它:
class TestObject : public Derived {
public:
MOCK_METHOD2(move, void(int x, int y));
};
TEST(Test, Testing)
{
TestObject obj;
EXPECT_CALL(obj, move(5, 10));
obj.update();
}
我正在对派生的 class 进行单元测试,并希望 EXPECT_CALL
调用属于其基础 class 的某个方法。
例如:
class Base {
public:
void move(int x, int y);
};
class Derived: public Base{
public:
RESULT update();
private:
int age;
};
HRESULT Derived::update(void) {
int param1 = 5, param2 = 10;
move(param1, param2);
age++;
return SUCCESS;
}
我不能只为 Derived 创建模拟并期望 move
因为没有依赖关系并且将调用实际的 move()。
我怎样才能模拟 move()
?我的最终目标是我需要期望使用正确的参数值调用 move()(在本例中为 param1 and param2
)。
当然这不是实际的代码,只是一个表示
我知道就 UT 而言,这不是一个好的设计,但这是为了测试一些遗留代码,我不允许重新格式化(但需要制作 UT)。所以能够模拟和测试 move() 是我真正拥有的最佳选择。
我们将不胜感激。谢谢!
在此代码中,请注意 mock。你在这里没有任何外部依赖。
此代码的测试如下所示:
TEST(DerivedTest, WhenUpdateIsCalledPossitionIsChangedAndItGetsOlder)
{
Derived foo;
foo.age = 1;
foo.update();
EXPECT_EQ(10, foo.x);
EXPECT_EQ(12, foo.y);
EXPECT_EQ(2, foo.age);
}
告诉我在这里嘲笑什么有意义的原因?
我认为不使用一些预处理技巧是不可能的。在测试时使方法虚拟化的那些技巧应该是最不痛苦的。 做这样的事情就足够了:
#if UNDER_TEST
#define TEST_VIRTUAL virtual
#else
#define TEST_VIRTUAL
#endif
class Base {
public:
TEST_VIRTUAL void move(int x, int y);
};
然后你可以像这样模拟它:
class TestObject : public Derived {
public:
MOCK_METHOD2(move, void(int x, int y));
};
TEST(Test, Testing)
{
TestObject obj;
EXPECT_CALL(obj, move(5, 10));
obj.update();
}