Das*_*aan 6 c++ googletest gmock
class Foo {
public:
int x;
int y;
void move(void);
};
class SuperFoo: public Foo {
public:
int age;
void update();
};
SuperFoo::update(void) {
move();
age++;
}
Run Code Online (Sandbox Code Playgroud)
我刚刚开始使用C++和单元测试,我有一些类似于上面的代码,我想用gmock来测试SuperFoo::update()调用基类的move()方法.什么是攻击这种情况的最佳方法?
一种方法是将move方法设为虚拟,并创建类的模拟:
#include "gtest/gtest.h"
#include "gmock/gmock.h"
class Foo {
public:
int x;
int y;
virtual void move(void);
//^^^^ following works for virtual methods
};
// ...
class TestableSuperFoo : public SuperFoo
{
public:
TestableSuperFoo();
MOCK_METHOD0(move, void ());
void doMove()
{
SuperFoo::move();
}
};
Run Code Online (Sandbox Code Playgroud)
然后在您的测试中,设置相应的呼叫期望
TEST(SuperFoo, TestUpdate)
{
TestableSuperFoo instance;
// Setup expectations:
// 1) number of times (Times(AtLeast(1)), or Times(1), or ...
// 2) behavior: calling base class "move" (not just mock's) if "move"
// has side-effects required by "update"
EXPECT_CALL(instance, move()).Times(testing::AtLeast(1))
.WillRepeatedly(testing::InvokeWithoutArgs(&instance, &TestableSuperFoo::doMove));
const int someValue = 42;
instance.age = someValue;
// Act
instance.update();
// Assert
EXPECT_EQ(someValue+1, instance.age);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5255 次 |
| 最近记录: |